/*************************************************************************
* 建立型: Singleton, Builder, Abstract Factory, Factory Method, Prototype
* 結構型: Decorator, Composite, Proxy, Adapter, Facade
* 行為型: Template Method, Iterator, Observer, Strategy, Command, ChainOR */
package factory;
/**
* @author jiq
* 型別:Creational
* 定義: 抽象工廠模式(Abstract Factory) 提供一個介面,用於建立相關或者依賴物件的家族,
* 而不需要指明具體類。
* OO設計原則: 要依賴抽象,而不要依賴具體類
* 與工廠方法關係:抽象工廠模式用到了工廠方法模式。
* 缺點: 如果要擴充建立的產品,需要更改抽象工廠介面。
*/
/**(抽象工廠)
* 抽象的建立各種原料的工廠
* 但是建立的具體原料是什麼,由其子類決定
* */
interface PizzaIngredientFactory{
public Dough createDough(); //工廠方法
public Sauce createSauce(); //工廠方法
public Cheese createCheese(); //工廠方法
}
/** 抽象工廠的子類,決定建立什麼樣的具體產品 */
class NYPizzaIndigredientFactory implements PizzaIngredientFactory{
public Cheese createCheese() { return new QQQCheese(); }
public Dough createDough() { return new YYYDough(); }
public Sauce createSauce() { return new WWWSauce(); }
}
/** 抽象工廠的子類,決定建立什麼樣的具體產品 */
class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{
public Cheese createCheese() { return new EEECheese(); }
public Dough createDough() { return new XXXDough(); }
public Sauce createSauce() { return new WWWSauce(); }
}
///////////////////////////////////////////////////////////////
/**
* 抽象的產品介面
* */
interface Dough{}
interface Sauce{}
interface Cheese{}
class XXXDough implements Dough{}
class YYYDough implements Dough{}
class WWWSauce implements Sauce{}
class QQQCheese implements Cheese{}
class EEECheese implements Cheese{}
//測試類
public class AbstractFactoryTest {
public static void main(String[] args) {
PizzaIngredientFactory nyfactory = new NYPizzaIndigredientFactory();
nyfactory.createCheese();
nyfactory.createDough();
nyfactory.createSauce();
}
}