一.分類ide
工廠模式主要是爲建立對象提供過渡接口,以便將建立對象的具體過程屏蔽隔離起來,達到提升靈活性的目的。測試
工廠模式主要分爲三個,簡單工廠模式(Simple Factory)/ 工廠方法模式(Factory Method) / 抽象工廠模式(Abstract Factory)。在某些書中分爲兩類主要是將簡單工廠模式(Simple Factory)看爲工廠方法模式的一種特例,二者歸爲一類。 this
二.詳解spa
1)簡單工廠模式(Simple Factory) 又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,能夠根據自變量的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。code
(1)工廠類(Creator)角色:擔任這個角色的是工廠方法模式的核心,含有與應用緊密相關的商業邏輯。工廠類在客戶端的直接調用下建立產品對象,它每每由一個具體Java 類實現。 對象
(2)抽象產品(Product)角色:擔任這個角色的類是工廠方法模式所建立的對象的父類,或它們共同擁有的接口。抽象產品角色能夠用一個Java 接口或者Java 抽象類實現。 blog
(3)具體產品(Concrete Product)角色:工廠方法模式所建立的任何對象都是這個角色的實例,具體產品角色由一個具體Java 類實現。 繼承
/** * 產品類的總接口. */ public interface Car { void driver(); } public class Coupe implements Car { public void driver() { System.out.println("雙門小汽車..."); } } public class Truck implements Car { public void driver() { System.out.println("大貨車出發了...."); } } /** * 建立產品的工廠類. */ public class CarFactory { public static Car CarFactory(String carType) { if(CarType.TRUCK.getValue().equals(carType)) { return new Truck(); } else if(CarType.COUPE.getValue().equals(carType)) { return new Coupe(); } return null; } } //------------------------------------------------------------------ // 建立了car enum 方便進行調用 //------------------------------------------------------------------ public enum CarType { /** * 貨車. */ TRUCK("TRUCK"), /** * 雙門汽車. */ COUPE("COUPE"); private final String value; private CarType(String value) { this.value = value; } public String getValue() { return value; } } //------------------------------------------------------------------ // 基於JUNIT 的測試類 //------------------------------------------------------------------ public class FactoryTest { @Test public void testFactory() { Coupe coupe = (Coupe) CarFactory.CarFactory(CarType.COUPE.getValue()); coupe.driver(); Truck truck = (Truck)CarFactory.CarFactory(CarType.TRUCK.getValue()); truck.driver(); } }
運行結果: 接口
簡單工廠模式的優缺點 get
簡單工廠模式的優勢以下:
(1)工廠類含有必要的判斷邏輯,能夠決定在何時建立哪個產品類的實例,客戶端能夠免除直接建立產品對象的責任,而僅僅「消費」產品;簡單工廠模式經過這種作法實現了對責任的分割,它提供了專門的工廠類用於建立對象。
(2)客戶端無需知道所建立的具體產品類的類名,只須要知道具體產品類所對應的參數便可,對於一些複雜的類名,經過簡單工廠模式能夠減小使用者的記憶量。
(3)經過引入配置文件,能夠在不修改任何客戶端代碼的狀況下更換和增長新的具體產品類,在必定程度上提升了系統的靈活性。
簡單工廠模式的缺點以下:
(1)因爲工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。
(2)使用簡單工廠模式將會增長系統中類的個數,在必定程序上增長了系統的複雜度和理解難度。
(3)系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能形成工廠邏輯過於複雜,不利於系統的擴展和維護。
(4)簡單工廠模式因爲使用了靜態工廠方法,形成工廠角色沒法造成基於繼承的等級結構。
簡單工廠模式的適用環境
(1)工廠類負責建立的對象比較少:因爲建立的對象較少,不會形成工廠方法中的業務邏輯太過複雜;
(2)客戶端只知道傳入工廠類的參數,對於如何建立對象不關心:客戶端既不須要關心建立細節,甚至連類名都不須要記住,只須要知道類型所對應的參數。
2)工廠方法模式(Factory Method) :工廠方法模式定義一個用於建立對象的接口,讓子類決定實例化哪個類。Factory Method是一個類的實例化延遲到其子類。在工廠方法模式中,核心的工廠類再也不負責全部的產品的建立,而是將具體建立的工做交給子類去作。這個核心類則搖身一變,成爲了一個抽象工廠角色,僅負責給出具體工廠子類必須實現的接口,而不接觸哪個產品類應當被實例化這種細節。
工廠方法模式角色
(1) 抽象工廠(Creator)角色:擔任這個角色的是工廠方法模式的核心,它是與應用程序無關的。任何在模式中建立對象的工廠類必須實現這個接口。在上面的 系統中這個角色由Java 接口Creator 扮演;在實際的系統中,這個角色也經常使用抽象Java 類實現。
(2) 具體工廠(Concrete Creator)角色:擔任這個角色的是實現了抽象工廠接口的具體Java 類。具體工廠角色含有與應用密切相關的邏輯,並 且受到應用程序的調用以建立產品對象。在本系統中給出了兩個這樣的角色,也就是具體Java 類ConcreteCreator1 和 ConcreteCreator2。
(3)抽象產品(Product)角色:工廠方法模式所建立的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在本系統中,這個角色由Java 接口Product 扮演;在實際的系統中,這個角色也經常使用抽象Java 類實現。
(4)具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所聲明的接口。工廠方法模式所建立的每個對象都是某個具體產品角色的實例。
產品類介紹
/** * * 這是咱們的產品類的總接口,就是說咱們的每一輛汽車都會有駕駛的功能 */ public abstract class Car { public abstract void driver(); } /** * 大貨車 */ public class BigTruck extends Car { @Override public void driver() { System.out.println("的大貨車出發了····"); } } public class Bus extends Car { @Override public void driver() { System.out.println("客車開動了 "); } } /** * 小轎車 * */ public class Sedan extends Car { @Override public void driver() { System.out.println("小轎車出發了"); } }