Преимущество шаблона фабричного метода

Из вики,

Шаблон проектирования Factory Method решает такие проблемы, как:

  1. Как можно создать объект, чтобы подклассы могли переопределять, экземпляр какого класса создавать?

  2. Как класс может отложить создание экземпляров до подклассов?

Например, MazeGame предоставляет возможность создания экземпляра для подкласса, такого как MagicMazeGame.

введите здесь описание изображения

где,

public abstract class MazeGame {
    private final List<Room> rooms = new ArrayList<>();

    public MazeGame() {
        Room room1 = makeRoom();
        Room room2 = makeRoom();
        room1.connect(room2);
        rooms.add(room1);
        rooms.add(room2);
    }

    abstract protected Room makeRoom();
}

Прочтите ответ.

Конечно, это порождающий шаблон, поэтому дизайн должен быть направлен на упрощение создания экземпляров класса.


Мой вопрос,

В чем преимущество шаблона фабричных методов, представляющего класс MagicGame, который предоставляет метод шаблона (public MazeGame(){..}) и откладывает создание экземпляра до подкласса MagicMazeGame или OrdinaryMazeGame?

откладывает создание экземпляра до подкласса только для абстрагирования нижеприведенных сложностей в классе, таком как MagicMazeGame,

        Room room1 = MagicMazeGame();
        Room room2 = MagicMazeGame();
        room1.connect(room2);
        rooms.add(room1);
        rooms.add(room2);

и предоставьте единую логику создания в каждом классе MagicMazeGame или классе OrdinaryMazeGame, как показано ниже,

public class MagicMazeGame extends MazeGame {
    public MagicMazeGame() {
        super();
    } 
    @Override
    protected Room makeRoom() {
        return new MagicRoom(); 
    }
}

person overexchange    schedule 22.12.2017    source источник


Ответы (1)


Преимущество использования шаблона фабричных методов заключается в том, что вы отделяете бизнес-логику создания класса от фактической логики класса, потому что, если у вас нет этого фабричного метода, каждый класс, который вы добавляете в свою систему, должен иметь фабричный метод внутри, и когда вам нужно что-то изменить в создании, вам, возможно, придется иметь дело со всем этим набором классов (плохо для принципа открытого-закрытого)

person Fabio Carpinato    schedule 22.12.2017
comment
Таким образом, чтобы избежать каких-либо изменений в логике создания во всем этом наборе классов MagicMazeGame или OrdinaryMazeGame, используется фабричный метод public MazeGame(){}. - person overexchange; 22.12.2017
comment
Как вы сказали: изменить что-то в создании, Вики говорит то же самое, Это делает нового Оператора излишним, позволяет придерживаться принципа Открытости/Закрытости и делает конечный продукт более гибок в случае изменений. - person overexchange; 22.12.2017
comment
Точно, всякий раз, когда вы можете попытаться избежать использования нового ключевого слова - person Fabio Carpinato; 22.12.2017
comment
Пользователи Java, используется ли этот шаблон где-либо в Java SE, Java EE или Spring? - person overexchange; 22.12.2017
comment
Весна часто использует его с бобами - person Fabio Carpinato; 22.12.2017
comment
Разработаны ли org.springframework.beans.factory.BeanFactory и org.springframework.context.ApplicationContext с использованием шаблона фабричных методов или абстрактного фабричного шаблона? Поскольку приложение Spring не подклассифицирует эти два класса и не пишет никакой упрощенной логики создания, как ожидается в шаблоне фабричный метод. - person overexchange; 22.12.2017
comment
Вместо этого приложение Spring использует фабричный класс, такой как BeanFactory factory = new XmlBeanFactory(new FileSystemResource("spring.xml"));, который выглядит как абстрактный фабричный шаблон, который предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов - person overexchange; 22.12.2017
comment
Вероятно, Class.forName("com.mysql.jdbc.Driver") - это заводской метод - person overexchange; 22.12.2017