Статьи

Фабричный метод против абстрактной фабрики (снова?)

Привет друзья,

Недавно один из моих друзей спросил меня, в чем разница между фабричным методом и абстрактным фабричным дизайном, но, похоже, я не убедил его легко. Конечно, я уже читал Head First, GoF, Pattern Hatching, Refactoring to Patterns, но не все из них, и это было не совсем недавно. Поэтому я решил изучить больше и попытаться просто различия, и вот моя попытка.


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

Фабричный метод : Определите интерфейс для создания объекта, но пусть подклассы решают, какой класс создать. Factory Method позволяет классу откладывать создание экземпляров для подклассов.

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

AF_DP

Различия

Один продукт против множества

Picture1

Это, пожалуй, самый простой, но, безусловно, важный. Фабричный метод используется только для  создания одного продукта,  но Абстрактная Фабрика предназначена для  создания семейств связанных или зависимых продуктов .

Наследование против композиции

Picture2

Это, пожалуй, самый запутанный (поскольку оба, кажется, используют наследование). Фабричный метод зависит от  наследования,  чтобы решить, какой продукт будет создан. В классе Creator (на структурной диаграмме) у него есть и  другие методы  (реализованные для управления продуктом), которые используют  единственный абстрактный метод  FactoryMethod () для создания  продукта и  могут быть реализованы / изменены только подклассами .

Здесь класс Creator также действует как  клиент,  который  зависит только от одного метода  для создания продукта. Мы должны создать  подкласс всего  класса Creator / Client, чтобы создать новый продукт. Нет отдельного и выделенного класса для создания Продукта, если бы мы могли использовать его с композицией, где мы можем передать объект фабрики клиенту, а клиент может использовать его, не попадая в иерархию наследования.

С другой стороны, в абстрактной фабрике есть  отдельный класс, предназначенный для создания  семейства связанных / зависимых продуктов, и его (любая конкретная фабрика подклассов)  объект  может быть передан клиенту, который его использует ( композиция ). Здесь  Клиент  получает  другой  объект (конкретную фабрику) для создания Продуктов,  а не создает себя  (например, с помощью factoryMethod () и принудительного наследования), и, таким образом, использует  композицию .

Если мы думаем только о  средствах создания продукта  и  клиенте,  который его использует, то ясно, что в Factory Method мы ограничены в использовании  наследования (на основе классов), а в Abstract Factory у нас есть гибкость  композиции  (на основе объектов) для создания конкретные продукты.

//Factory Method
 class Client {
   public void anOperation() {
     Product p = factoryMethod();
     p.doSomething();
   }
   protected Product factoryMethod() {//or it can be abstract as well
     return new DefaultProduct();
   }
 }
 class NewClient extends Client {
   protected Product factoryMethod() {//overriding
     return new SpecificProduct();
   }
 }
 //Abstract Factory
 class Client {
   private Factory factory;
   public Client (Factory factory) {
     this.factory = factory;
   } 
   public void anOperation() {
     ProductA p = factory.createProductA();
     p.doSomething();//other products and operations as well
   }
 }
 interface Factory {
   ProductA createProductA();
   ProductB createProductB();
 }
 //concrete factories also, implementing Factory interface
 

Метод против полного класса (объекта)

Picture3

Фабричный метод — это  просто метод,  а абстрактный Фабрика — это  объектЦель  методы фабрики класса , имеющее это  не только создавать  объекты, это делает другую работу также,  только метод отвечает  за  создание  объекта. В Абстрактной Фабрике  вся цель  класса —  создать семейство объектов .

Уровень абстракции

уровня из-абстракции-640x390

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

Один внутри другого

Picture4

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

Я также считаю, что мы не должны зацикливаться на шаблонах проектирования, все они основаны на хороших базовых принципах проектирования и часто смешиваются при использовании в реальном мире.

Я надеюсь, что это помогает кому-то еще. Дайте мне также знать, если это может быть улучшено.

Счастливые шаблоны, пока.