Разница между шаблоном Abstract Factory и Factory заключается в том, что шаблон AbstractFactory использует состав для делегирования ответственности за создание объекта другому классу, тогда как шаблон Factory pattern использует наследование и полагается на производный класс или подкласс для создания объекта ,Как абстрактная фабрика использует делегирование
Ниже приведен типичный пример абстрактной фабрики (http://www.oodesign.com/abstract-factory-pattern.html). Может кто-нибудь объяснить мне, где абстрактная фабрика использует композицию объекта?
abstract class AbstractProductA{
public abstract void operationA1();
public abstract void operationA2();
}
class ProductA1 extends AbstractProductA{
ProductA1(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
public void operationA1() { };
public void operationA2() { };
}
class ProductA2 extends AbstractProductA{
ProductA2(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
public void operationA1() { };
public void operationA2() { };
}
abstract class AbstractProductB{
//public abstract void operationB1();
//public abstract void operationB2();
}
class ProductB1 extends AbstractProductB{
ProductB1(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
}
class ProductB2 extends AbstractProductB{
ProductB2(String arg){
System.out.println("Hello "+arg);
} // Implement the code here
}
abstract class AbstractFactory{
abstract AbstractProductA createProductA();
abstract AbstractProductB createProductB();
}
class ConcreteFactory1 extends AbstractFactory{
AbstractProductA createProductA(){
return new ProductA1("ProductA1");
}
AbstractProductB createProductB(){
return new ProductB1("ProductB1");
}
}
class ConcreteFactory2 extends AbstractFactory{
AbstractProductA createProductA(){
return new ProductA2("ProductA2");
}
AbstractProductB createProductB(){
return new ProductB2("ProductB2");
}
}
Что касается, как я понял, подкласс ConcreteFactory1
и ConcreteFactory1
возвращаются объект к клиенту. И он обычно работает как класс Factory с более чем одним продуктом.
Где, как клиентский код может быть
AbstractFactory factory = new ConcreteFactory2();
AbstractProductA prodA = factory.createProductA();
Может кто-то пожалуйста, объясните мне, где же состав объекта/делегации произойдет в Abstract Factory?
Возможный дубликат [Шаблоны проектирования: Абстрактная фабрика против фабричного метода] (http://stackoverflow.com/questions/4209791/design-patterns-abstract-factory-vs-factory-method) –
Различие в намерениях хорошо объяснено в приведенной выше ссылке. Абстрактная фабрика - это просто интерфейс для конкретных заводов по созданию семейства продуктов. Он оставляет его на конкретных заводах для создания продуктов. И вот, как может произойти делегация. Но делегация ИМО - неверное слово. –
Хороший пример завода пиццы представлен в шаблонах Head First Design. –