Каковы различия между абстрактными фабричными и фабричными шаблонами? - PullRequest
394 голосов
/ 21 апреля 2011

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

Из того, что я читал, я вижу, что шаблон фабричного метода позволяет вам определить, как создать отдельный конкретный продукт, но скрыть реализацию от клиента, поскольку они увидят общий продукт. Мой первый вопрос об абстрактной фабрике. Его роль - позволить вам создавать семейства конкретных объектов (которые могут зависеть от того, какую конкретную фабрику вы используете), а не только один конкретный объект? Абстрактная фабрика возвращает только один очень большой объект или много объектов в зависимости от того, какие методы вы вызываете?

Мои последние два вопроса касаются одной цитаты, которую я не могу полностью понять, которую я видел во многих местах:

Одно из различий заключается в том, что с шаблоном Абстрактная фабрика, класс делегирует ответственность создание объекта для другого объекта через композицию, тогда как Фабрика Шаблон метода использует наследование и опирается на подкласс для обработки создание нужного объекта.

Насколько я понимаю, шаблон фабричного метода имеет интерфейс Creator, который заставит ConcreteCreator отвечать за то, какой экземпляр ConcreteProduct создать. Это что значит, используя наследование для обработки объекта?

Теперь, что касается этой цитаты, как именно шаблон Abstract Factory делегирует ответственность за создание экземпляра объекта другому объекту посредством композиции? Что это значит? Похоже, что шаблон Abstract Factory также использует наследование для выполнения процесса построения в моих глазах, но опять же я все еще изучаю эти шаблоны.

Любая помощь, особенно с последним вопросом, будет принята с благодарностью.

Ответы [ 16 ]

1 голос
/ 23 ноября 2017

Пример из реальной жизни. (Легко запомнить)

Завод

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

Абстрактная фабрика

Теперь рассмотрим тот же пример двери. Вы можете пойти к плотнику, или вы можете пойти в магазин пластиковых дверей или магазин ПВХ. Все они являются дверными фабриками. Исходя из ситуации, вы решаете, к какой фабрике вам нужно подходить. Это как Абстрактная Фабрика.

Я объяснил здесь как шаблон фабричного метода, так и абстрактный фабричный шаблон, начиная с того, что не используя их, объясняя проблемы, а затем решая проблемы, используя вышеупомянутые шаблоны https://github.com/vikramnagineni/Design-Patterns/tree/master

0 голосов
/ 06 мая 2019

Абстрактная фабрика : фабрика фабрик;фабрика, которая группирует отдельные, но связанные / зависимые фабрики вместе без указания их конкретных классов. Абстрактный пример фабрики

Фабрика : Предоставляет способ делегировать логику реализации дочерним классам. Пример фабричного образца

0 голосов
/ 05 апреля 2019

Метод фабрики опирается на наследование: создание объекта делегируется подклассам, которые реализуют метод фабрики для создания объектов.

Абстрактная фабрика опирается на композицию объекта: создание объекта осуществляется в методах, предоставляемых в интерфейсе фабрики.

Диаграмма высокого уровня фабричной и абстрактной фабричной модели,

diagram

Подробнее о методе Factory см. в этой статье .

Подробнее о методе абстрактной фабрики см. в этой статье .

0 голосов
/ 09 июня 2018

Многие из приведенных выше ответов не обеспечивают сравнения кода между шаблоном Abstract Factory и Factory Method.Следующее - моя попытка объяснить это через Java.Надеюсь, что это поможет кому-то, кто нуждается в простом объяснении.

Как метко говорит GoF: Abstract Factory предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

        public class Client {
            public static void main(String[] args) {
               ZooFactory zooFactory = new HerbivoreZooFactory();       
               Animal animal1 = zooFactory.animal1();
               Animal animal2 = zooFactory.animal2();
               animal1.sound();
               animal2.sound();

               System.out.println();

               AnimalFactory animalFactory = new CowAnimalFactory();
               Animal animal = animalFactory.createAnimal();
               animal.sound();
            }
        }

        public interface Animal {
            public void sound();
        }

        public class Cow implements Animal {

            @Override
            public void sound() {
                System.out.println("Cow moos");
            }

        }

        public class Deer implements Animal {

            @Override
            public void sound() {
                System.out.println("Deer grunts");
            }

        }

        public class Hyena implements Animal {

            @Override
            public void sound() {
                System.out.println("Hyena.java");
            }

        }

        public class Lion implements Animal {

            @Override
            public void sound() {
                System.out.println("Lion roars");
            }

        }

        public interface ZooFactory {
            Animal animal1();

            Animal animal2();
        }

        public class CarnivoreZooFactory implements ZooFactory {

            @Override
            public Animal animal1() {
                return new Lion();
            }

            @Override
            public Animal animal2() {
                return new Hyena();
            }

        }

        public class HerbivoreZooFactory implements ZooFactory{

            @Override
            public Animal animal1() {
                return new Cow();
            }

            @Override
            public Animal animal2() {
                return new Deer();
            }

        }

        public interface AnimalFactory {
            public Animal createAnimal();
        }

        public class CowAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Cow();
            }

        }

        public class DeerAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Deer();
            }

        }

        public class HyenaAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Hyena();
            }

        }

        public class LionAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Lion();
            }

        }
0 голосов
/ 04 мая 2018

позвольте мне поставить это точно.большинство ответов уже объяснены, предоставлены диаграммы и примеры.так что мой ответ будет только один лайнер.Мои собственные слова: - «абстрактный фабричный шаблон добавляет на абстрактный слой несколько реализаций метода фабрики.означает абстрактную фабрику , содержащую или составную один или несколько шаблонов фабричных методов ”

0 голосов
/ 30 августа 2016

Я бы предпочел Абстрактную Фабрику над Фабричным Методом в любое время.Из приведенного выше примера Тома Даллинга (отличное объяснение) мы можем видеть, что Абстрактная Фабрика является более компонуемой в том смысле, что все, что нам нужно сделать, это передать другую Фабрику конструктору (здесь используется внедрение зависимости конструктора).Но Factory Method требует от нас ввести новый класс (больше вещей для управления) и использовать подклассы.Всегда предпочитайте композицию наследству.

...