Паттерн "Абстрактная Фабрика"
Здравствуйте.
Читаю GoF параллельно вместе с Вашей книгой.
В книге GoF, в разделе "Реализация", для абстрактной фабрики написано следующее:
Если семейств продуктов может быть много, то конкретную фабрику удастся реализовать с помощью паттерна прототип. В этом случае она инициализируется экземпляром-прототипом каждого продукта в семействе и создает новый продукт путем клонирования этого прототипа. Подход на основе прототипов устраняет необходимость создавать новый класс конкретной фабрики для каждого нового семейства продуктов.
Единственный пример реализации абстрактной фабрики через прототип, который смог найти, есть при переходе на эту ссылку: https://sourcemaking.com/design_patterns/abstract_factory/java/2
В вышеприведенной ссылке, все равно создаются конкретные фабрики. И мне не понятно, как прототипы избавляют от необходимости создания конкретных фабрик.
Вопрос: что имели в виду Банда Четырех, когда писали, что прототипы избавляют от необходимости создавать новые конкретные фабрики для новых семейств объектов?
Solution
Здравствуйте, Евгений.
Это очень хороший вопрос. Ниже — моё личное мнение, я не могу говорить за GoF. Полагаю, они имели в виду что-то вроде этого:
abstract class AbstractFactory abstract method createProductA: ProductA abstract method createProductB: ProductB class ConcreteFactoryViaPrototypes extends AbstractFacotry is field productAPrototype: ProductA field productBProtype: ProductA constructor ConcreteFactoryViaPrototypes(productA, productB) productAPrototype = productA productBProtype = productB method createProductA():ProductA is return productAPrototype.clone() method createProductB():ProductB is return productBPrototype.clone()
Клиент, вместо того, чтобы создавать несколько разных подклассов ConcreteFactory, имеет лишь один, и уже в клиентском коде настраивает разные фабрики под свои нужды.
modernFactory = new ConcreteFactoryViaPrototype(modernChairObject, modernCouchObject) classicFactory = new ConcreteFactoryViaPrototype(classicChairObject, classicCouchObject)
Прошу прощения за оформление ответа, надеюсь псевдокод выше хоть немного понятен.
Service d'assistance aux clients par UserEcho
Здравствуйте, Евгений.
Это очень хороший вопрос. Ниже — моё личное мнение, я не могу говорить за GoF. Полагаю, они имели в виду что-то вроде этого:
Клиент, вместо того, чтобы создавать несколько разных подклассов ConcreteFactory, имеет лишь один, и уже в клиентском коде настраивает разные фабрики под свои нужды.