public class SimplePhoneFactory { public static Cellphone getCellphone(String type){ if("iPhone".equals(type)){ return new IPhone(); }else if("Samsung".equals(type)) { return new Samsung(); }else { throw new RuntimeException("沒有正確的手機類型創建"); } } }
/* 工廠方法接口 */ public interface PhoneFactory { public Cellphone getPhone(); }
/* * @Description: iPhone 工廠 */ public class IPhoneFactory implements PhoneFactory{ @Override public Cellphone getPhone() { // TODO Auto-generated method stub return new IPhone(); } }
/* * @Description:samsung工廠 */ public class SamsungPhoneFactory implements PhoneFactory{ @Override public Cellphone getPhone() { // TODO Auto-generated method stub return new Samsung(); } }
以上代碼可以看出,每個產品都需要自己的實現工廠,這時如果我們需要新增加新產品,比如小米手機,只需要新增一個MIPhoneFactory來實現PhoneFactory即可。
public interface CPU { void run(); void start(); } //高端CPU class GoodCUP implements CPU{ @Override public void run() { System.out.println("高端CPU運轉方法。。。"); } @Override public void start() { System.out.println("高端CPU開始方法。。。"); } } //低端CPU class BadCPU implements CPU{ @Override public void run() { System.out.println("低端CPU運轉方法。。。"); } @Override public void start() { System.out.println("低端CPU開始方法。。。"); } }
然後是相機接口,以及相關的相機生產類型,其中的方法是隨便寫的。
public interface Camera { public void take(); } class GoodCamera implements Camera{ @Override public void take() { System.out.println("高端相機拍照。。。"); } } class BadCamera implements Camera{ @Override public void take() { System.out.println("低端相機拍照。。。"); } }
最後一個內存的接口已經一系列類型:
public interface Memory { void work(); } class GoodMemory implements Memory{ @Override public void work() { System.out.println("高性能內存工作"); } } class BadMemory implements Memory{ @Override public void work() { System.out.println("低性能內存工作"); } }
我們前面說了,抽象工廠就是利用一些列組件組合產品的工廠,上面我們寫的CPU,相機,內存都是我們要組件手機的組件。現在,我們開始寫我們的抽象工廠。當然為了方便,肯定要有工廠接口:
public interface AbPhoneFactory { CPU getCPU(); Camera getCamera(); Memory getMemory(); }
然後,我們根據自己的需要,隨機組合幾種組件,即可得到我們的產品,當然這是一組(產品)組合出來的最終產品。
比如我們用好的CPU,好的內存,好的相機組合成一個好的手機:
public class GoodsPhoneFactory implements AbPhoneFactory{ @Override public CPU getCPU() { // TODO Auto-generated method stub return new GoodCUP(); } @Override public Camera getCamera() { // TODO Auto-generated method stub return new GoodCamera(); } @Override public Memory getMemory() { // TODO Auto-generated method stub return new GoodMemory(); } }
也可以用差的CPU,差的內存,差的相機組合成比較差勁的手機:
public class BadPhoneFactory implements AbPhoneFactory{ @Override public CPU getCPU() { // TODO Auto-generated method stub return new BadCPU(); } @Override public Camera getCamera() { // TODO Auto-generated method stub return new BadCamera(); } @Override public Memory getMemory() { // TODO Auto-generated method stub return new BadMemory(); } }
當然你也可以亂組合成中等的,這都是隨你便了,只要加一個工廠實現即可。
對於單一產品,簡單工廠更簡單,但是新增產品時卻很乏力,或者說不符合設計原則,而工廠方法是不修改原有類的前提下,新增工廠類實現,更符合設計原則。是不是我們在單一產品的時候就該選擇工廠方法了呢?下面給出這麼一個對比:
-- 結構復雜度 簡單工廠更加簡單 簡單工廠優於工廠方法
-- 代碼復雜度 工廠方法復雜度較高 簡單工廠優於工廠方法
-- 客戶端編程難度 工廠方法客戶端需要了解更多的實現工廠 簡單工廠優於工廠方法
-- 管理難度 工廠方法由於實現工廠類較多,管理更難 簡單工廠優於工廠方法
結合以上四點,我們說簡單工廠比工廠方法更加易用。這也就是開發時候簡單工廠比工廠方法使用的更多的原因。
對於產品族,如果使用工廠模式,唯一的選擇--抽象工廠。
OK,更多詳細代碼和本次測試代碼請參考github:https://github.com/LiuJishuai/designPatterns。