💛原文地址爲http://www.javashuo.com/article/p-ytssvnua-bx.html,轉載請註明出處!html
簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是經過專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。java
將「類實例化的操做」與「使用對象的操做」分開,讓使用者不用知道具體參數就能夠實例化出所須要的「產品」類,從而避免了在客戶端代碼中顯式指定,實現瞭解耦。設計模式
即便用者可直接消費產品而不須要知道其生產的細節iphone
優勢:實現解耦,不用關注如何生產,將使用和生產分離,若是生產的產品只有一種這種方式能夠知足使用。ide
缺點:若是新增產品,例如新增vivo手機,須要在SimpleFac
中修改源碼,不符合設計模式的開閉原則——對修改關閉,對擴展開放
,所以簡單工廠模式不屬於23種設計模式中的一種。測試
咱們經過手機的生產過程來演示簡單工廠模式。this
手機產品的接口及其實現類設計
/** * 手機接口 */ public interface Phone { /** 打電話 */ void call(); } public class Iphone implements Phone{ @Override public void call() { System.out.println("iphone撥打電話"); } } public class Xiaomi8 implements Phone { @Override public void call() { System.out.println("小米8撥打電話"); } }
用來表示手機名稱的枚舉類code
/** * 手機名稱 enum */ public enum PhoneNameEnum { /** iphone */ IPHONE11("iphone"), /** 小米8 */ XIAOMI8("xiaomi8"), ; String name; PhoneNameEnum(String name) { this.name = name; } public String getName() { return name; } }
生產手機產品的工廠類htm
public class SimplePhoneFac { public Phone producePhone(String phoneName) { if (null == phoneName || 0 == phoneName.length()) { return null; } if (phoneName.equals(PhoneNameEnum.IPHONE11.getName())) { return new Iphone(); } else if (phoneName.equals(PhoneNameEnum.XIAOMI8.getName())) { return new Xiaomi8(); } else { return null; } } }
測試結果
public class SimpleFacTest { public static void main(String[] args) { SimplePhoneFac simplePhoneFac = new SimplePhoneFac(); Iphone iphone = (Iphone) simplePhoneFac.producePhone(PhoneNameEnum.IPHONE11.getName()); if (null == iphone) { System.out.println("iphone 生產失敗"); } else { iphone.call(); } Xiaomi8 xiaomi8 = (Xiaomi8) simplePhoneFac.producePhone(PhoneNameEnum.XIAOMI8.getName()); if (null == xiaomi8) { System.out.println("xiaomi8 生產失敗"); } else { xiaomi8.call(); } } }
iphone撥打電話 小米8撥打電話
工廠方法模式,又稱工廠模式,定義一個建立產品對象的工廠接口,將產品對象的實際建立工做推遲到具體子工廠類當中。這知足建立型模式中所要求的「建立與使用相分離」的特色。
將類的實例化(具體產品的建立)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該實例化(建立)哪個類。
本節介紹的工廠方法模式是對簡單工廠模式的進一步抽象化,其好處是可使系統在不修改原來代碼的狀況下引進新的產品,即知足開閉原則。
工廠方法模式的主要角色以下。
工廠方法模式的主要優勢有:
其缺點是:每增長一個產品就要增長一個具體產品類和一個對應的具體工廠類,這增長了系統的複雜度。
咱們經過手機工廠分別生成iphone和小米8兩種機型來講明工廠方法模式。後續若是新增產品例如Vivo手機只須要實現Phone接口,建立VivoFac工廠類進行生產便可。
手機產品接口及其具體實現類
/** * 手機接口 */ public interface Phone { /** 打電話 */ void call(); } public class Iphone implements Phone{ @Override public void call() { System.out.println("iphone撥打電話"); } } public class Xiaomi8 implements Phone { @Override public void call() { System.out.println("小米8撥打電話"); } }
抽象工廠及其具體工廠
/** * phone 的抽象工廠 */ public abstract class AbstractPhoneFac { /** 生產 phone */ public abstract Phone producePhone(); } /** * iphone 生產工廠 */ public class IphoneFac extends AbstractPhoneFac { @Override public Phone producePhone() { return new Iphone(); } } /** * 小米生產工廠 */ public class XiaomiFac extends AbstractPhoneFac { @Override public Phone producePhone() { return new Xiaomi8(); } }
測試結果
public class FacMethodTest { public static void main(String[] args) { XiaomiFac xiaomiFac = new XiaomiFac(); Xiaomi8 xiaomi8 = (Xiaomi8) xiaomiFac.producePhone(); xiaomi8.call(); IphoneFac iphoneFac = new IphoneFac(); Iphone iphone = (Iphone) iphoneFac.producePhone(); iphone.call(); } }
小米8撥打電話 iphone撥打電話