0
Answered

Паттерн "Абстрактная Фабрика"

Eugene Polischuk 1 month ago updated by Alexander Shvets 1 month ago 2

Здравствуйте.

Читаю GoF параллельно вместе с Вашей книгой.

В книге GoF, в разделе "Реализация", для абстрактной фабрики написано следующее:

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

Единственный пример реализации абстрактной фабрики через прототип, который смог найти, есть при переходе на эту ссылку: https://sourcemaking.com/design_patterns/abstract_factory/java/2

В вышеприведенной ссылке, все равно создаются конкретные фабрики. И мне не понятно, как прототипы избавляют от необходимости создания конкретных фабрик.

Вопрос: что имели в виду Банда Четырех, когда писали, что прототипы избавляют от необходимости создавать новые конкретные фабрики для новых семейств объектов?

Answer

+1
Answer
Answered

Здравствуйте, Евгений.

Это очень хороший вопрос. Ниже — моё личное мнение, я не могу говорить за 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)
GOOD, I'M SATISFIED

Спасибо большое!

Satisfaction mark by Eugene Polischuk 1 month ago
+1
Answer
Answered

Здравствуйте, Евгений.

Это очень хороший вопрос. Ниже — моё личное мнение, я не могу говорить за 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)
+1

Прошу прощения за оформление ответа, надеюсь псевдокод выше хоть немного понятен.