工廠模式提供建立對象的接口。java
工廠模式分爲三類:簡單工廠模式(Simple Factory), 工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory).
GOF在《設計模式〉中將工廠模式分爲兩類:工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory)。設計模式
1. 簡單工廠模式(Simple Factory)
簡單工廠模式又叫作靜態工廠方法模式。簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該建立哪個產品類(這些產品類繼承自一個父類或接口)的實例。
該模式中包含的角色及職責:
工廠(Creator)角色:它是簡單工廠模式的核心,負責實現建立全部實例的內部邏輯。工廠類能夠被外界直接調用,建立所須要的產品對象。
抽象產品角色:它負責描述全部實例所共有的公共接口。
具體產品角色:是簡單工廠模式的建立目標,全部建立的對象都是充當這個角色的某個具體類的實例。ide
缺點:在工廠類中集中了全部實例的建立邏輯,違反了高內聚責任分配原則,將所有建立邏輯集中到了一個工廠類中;對系統的維護和擴展不利;設計
使用場景:負責建立的對象比較少;客戶只知道傳入工廠類的參數,對於如何建立對象的邏輯不關心;容易違反高內聚責任分配原則,因此只在很簡單的狀況下應用;code
類圖:對象
實例:繼承
//抽象產品角色 public interface IProduct { public void saleProduct(); } //具體產品角色 public class Product_A implements IProduct { @Override public void saleProduct(){ ... } } //具體產品角色 public class Product_B implements IProduct { @Override public void saleProduct(){ ... } } //工廠角色 public class Creator { public IProduct createProduct(int productFlag){ switch(productFlag){ case 1: return new Product_A(); case 2: return new Product_B(); default: return null; } } }
2. 工廠方法模式(Factory Method)
工廠方法模式是簡單工廠方法模式的衍生,它的核心工廠類再也不負責產品的建立,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,使得系統能夠在不修改具體工廠角色的狀況下引用新的產品。
在這個模式中,一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品。
工廠方法模式是最典型的模板方法模式(Template Method Pattern)應用。接口
該模式中包含的角色及職責: 產品
抽象工廠(Creator)角色:工廠方法模式的核心,任何在模式中建立的對象的工廠必須實現這個接口。
具體工廠(Concrete Creator)角色:實現抽象工廠接口的具體工廠類,包含應用程序的邏輯。
抽象產品(Product)角色:產品對象的共同父類或共同擁有的接口。
具體產品(Concrete Product)角色:實現了抽象產品角色定義的接口,其具體產品有專門的具體工廠建立。it
使用場景:
對於某個產品,調用者清楚知道應該使用哪一個具體工廠服務,實例化該具體工廠,生產出具體的產品來;
只是須要一種產品,對於那個工廠生產的並不關心,最終選用哪一個具體工廠由生產者一方決定,它根據當前系統的狀況來實例化一個具體的工廠返回給使用者,這個決策過程對於使用者來講是透明的。
類圖:
實例:
//抽象工廠 public interface Creator{ public Light factory(); } //抽象產品 public interface Light{ public void TurnOn(); public void TrunOff(); } //具體產品 public class BullbLight implements Light{ public void TurnOn(){ } public void TrunOff(){ } } //具體產品 public class TubeLight implements Light{ public void TurnOn(){ } public void TrunOff(){ } } //具體工廠 public class BullbCreator implements Creator{ public Light factory(){ return new BullbLight(); } } //具體工廠 public class TubeCreator implements Creator{ public Light factory(){ return new TubeLight(); } } public class Client{ public static void main(String[] args){ Creator create = new BullbCreator(); Light bullbLight = create.factory(); bullbLight.TurnOn(); Creator create1 = new TubeCreator(); Light tubebLight = create.factory(); tubebLight.TurnOn(); } }
3. 抽象工廠模式(Abstract Factory)
抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式能夠向客戶端提供一個接口,使客戶端在沒必要指定產品的具體狀況下,建立多個產品族中的產品對象。
類圖:
實例:
//抽象工廠角色 public interface AbstractFactory{ public ProductA createProductA(); public ProductB createProductB(); } //抽象產品類A public interface AbstractProductA { } //抽象產品類B public interface AbstractProductB { } //具體產品類ProdcutA1 public class ProductA1 implements AbstractProductA { public ProductA1() { } } //具體產品類ProdcutA2 public class ProductA2 implements AbstractProductA { public ProductA2() { } } //具體產品類ProductB1 public class ProductB1 implements AbstractProductB { public ProductB1() { } } //具體產品類ProductB2 public class ProductB2 implements AbstractProductB { public ProductB2() { } } //具體工廠類1 public class ConcreteFactory1 implements AbstractFactory{ public AbstractProductA createProductA(){ return new ProductA1(); } public AbstractProductB createProductB(){ return new ProductB1(); } } //具體工廠類2 public class ConcreteFactory2 implements AbstractFactory{ public AbstractProductA createProductA(){ return new ProductA2(); } public AbstractProductB createProductB(){ return new ProductB2(); } }