1. 概念
工廠方法:一抽象產品類派生出多個具體產品類;一抽象工廠類派生出多個具體工廠類;每個具體工廠類只能創建一個具體產品類的實例。
即定義一個創建對象的接口(即抽象工廠類),讓其子類(具體工廠類)決定實例化哪一個類(具體產品類)。“一對一”的關係。
抽象工廠:多個抽象產品類,派生出多個具體產品類;一個抽象工廠類,派生出多個具體工廠類;每個具體工廠類可創建多個具體產品類的實例。
即提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們的具體的類。“一對多”的關係。
2. UML
工廠方法:
抽象工廠:
3. 代碼
工廠方法:
public interface Product { } public interface Creator { public Product factory(); } public class ConcreteProduct1 implements Product { public ConcreteProduct1() { System.out.println("ConcreteProduct1被創建"); } } public class ConcreteProduct2 implements Product { public ConcreteProduct2() { System.out.println("ConcreteProduct2被創建"); } } public class ConcreteCreator1 implements Creator { public Product factory() { return new ConcreteProduct1(); } } public class ConcreteCreator2 implements Creator { public Product factory() { return new ConcreteProduct2(); } } public class Client { private static Creator creator1, creator2; private static Product prod1, prod2; public static void main(String[] args) { creator1 = new ConcreteCreator1(); prod1 = creator1.factory(); System.out.println("----------------------------"); creator2 = new ConcreteCreator2(); prod2 = creator2.factory(); } }
抽象工廠:
//定義不同的產品之間的一定具備的標準,用interface實現 //其中的method()方法可看作提取出不同產品的共性,如手機都有類似的功能 interface IProductA{ public void method(); } interface IProductB{ public void method(); } //實現了產品標準實現的一系列具體產品 //由於已經設計好A1由廠商1生產,故以下輸出代碼有“廠商x” class ProductA1 implements IProductA{ public void method() { System.out.println("廠商1 生產ProductA1 ..."); } } class ProductA2 implements IProductA{ public void method() { System.out.println("廠商2 生產ProductA2 ..."); } } class ProductB1 implements IProductB{ public void method() { System.out.println("廠商1 生產ProductB1 ..."); } } class ProductB2 implements IProductB{ public void method() { System.out.println("廠商2 生產ProductB2 ..."); } } //每一種牌子的產品生產工廠,即不同的廠商負責自己牌子產品的生產 abstract class Factory1{ abstract IProductA getProductA1(); abstract IProductB getProductB1(); } abstract class Factory2{ abstract IProductA getProductA2(); abstract IProductB getProductB2(); } //具體的工廠用來生產相關的產品 class ConcreteFactory1 extends Factory1{ public IProductA getProductA1() { return new ProductA1(); } public IProductB getProductB1() { return new ProductB1(); } } class ConcreteFactoryB extends Factory2{ public IProductA getProductA2() { return new ProductA2(); } public IProductB getProductB2() { return new ProductB2(); } } //測試類 public class Client { public static void main(String[] args) { //廠商1負責生產產品A1、B1 Factory1 factory1 = new ConcreteFactory1(); IProductA productA1 = factory1.getProductA1(); IProductB productB1 = factory1.getProductB1(); productA1.method(); productB1.method(); //廠商2負責生產產品A2、B2 Factory2 factory2 = new ConcreteFactoryB(); IProductA productA2 = factory2.getProductA2(); IProductB productB2 = factory2.getProductB2(); productA2.method(); productB2.method(); } }
4. 應用場景
工廠方法:
在以下情況下,適用於工廠方法模式:
(1) 當一個類不知道它所必須創建的對象的類的時候。
(2) 當一個類希望由它的子類來指定它所創建的對象的時候。
(3) 當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
抽象工廠:
(1) 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有形態的工廠模式都是重要的。
(2) 這個系統有多於一個的產品族,而系統只消費其中某一產品族。
(3) 同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。
(4) 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於實現。