定義:
定義一個用於建立對象的介面,讓子類決定將哪一個類執行個體化。Factory 方法使一個類的執行個體化延遲到其子類。 講解:
Factory 方法模式對簡單原廠模式進行了抽象,根據依賴倒轉原則,Factory 方法模式把工廠和產品做了抽象處理,抽象出了抽象工廠(抽象類別或介面)和抽象產品(抽象類別或介面)。產品類的執行個體化由實現了抽象工廠的具體工廠來實現。 類圖:
角色:
抽象工廠類(Creator):抽象類別或介面,定義抽象的工廠對象,提供一個建立產品對象的方法。
具體工廠類(ConcreteCreator):實作類別,實現抽象工廠類,實現建立具體產品的方法。
抽象產品類(Product):抽象類別或介面,定義抽象的產品對象。
具體產品類(ConcreteProduct):實作類別,實現抽象產品類,定義具體的產品對象。 代碼:
//工廠介面interface IFactory {public ICar createCar();}// 產品介面interface ICar {public void run();}// 小汽車工廠類class SmallCarFactory implements IFactory {public ICar createCar() {return new SmallCar();}}// 大汽車工廠類class BigCarFactory implements IFactory {public ICar createCar() {return new BigCar();}}// 小汽車產品類class SmallCar implements ICar {public void run() {System.out.println("小汽車啟動");}}// 大汽車產品類class BigCar implements ICar {public void run() {System.out.println("大汽車啟動");}}// 用戶端public class Client {private static IFactory factory1, factory2;private static ICar car1, car2;public static void main(String[] args) {factory1 = new SmallCarFactory();car1 = factory1.createCar();car1.run();// 小汽車啟動factory2 = new BigCarFactory();car2 = factory2.createCar();car2.run();// 大汽車啟動}}好處: 良好的封裝性,代碼結構清晰。工廠類封裝了產品的建立過程,只提供擷取產品的方法。 良好的擴充性。當系統需要增加新的產品時,只需要增加一個產品類和一個與其對應的工廠類。 屏蔽工廠類和產品類。用戶端只依賴於抽象工廠類和抽象產品類,而不直接依賴於具體的工廠類和具體的產品類。 降低耦合。由於用戶端不依賴於具體工廠類和具體產品類,當具體工廠類執行個體化產品的過程發生變化時,並不影響用戶端的代碼。
使用情境: Factory 方法模式作為建立型模式,可以替代new來建立對象。對象應該有公用的行為方法,並且對象的建立過程相對複雜。如果對象建立過程過於簡單,則不必使用Factory 方法模式,可直接使用new來建立。