抽象工廠模式:用於解決「多個不一樣類型的對象須要被同一處調用且同一類型的不一樣對象須要被多處調用」的情景。html
示例說明:工廠A(FactoryA)能夠生產電腦A(ComputerA)和手機A(MobilePhoneA),工廠B(FactoryB)也能夠生產電腦B(ComputerB)和手機B(MobilePhoneB)。要求程序能夠靈活的添加手機產品和電腦產品。設計模式
優點:便於添加同類型的產品,例如添加 ComputerC、ComputerD、MobilePhoneC、MobilePhoneDide
劣勢:不便於類型的擴展,例如添加CDPlayer產品,添加TV產品。post
類圖以下:測試
看代碼:url
定義電腦接口:spa
package com.zpj.designMode.abstractFactory; public interface Computer{ public void IamComputer(); }
添加兩個實現類設計
ComputerA :3d
package com.zpj.designMode.abstractFactory; public class ComputerA implements Computer{ @Override public void IamComputer() { System.out.println("---------- i am ComputerA and from FactoryA----"); } }
ComputerB :
package com.zpj.designMode.abstractFactory; public class ComputerB implements Computer{ @Override public void IamComputer() { System.out.println("---------- i am ComputerB and from FactoryB----"); } }
定義手機接口:MobilePhonecode
package com.zpj.designMode.abstractFactory; public interface MobilePhone{ public void IamMobilePhone(); }
手機接口實現類:MobilePhoneA
package com.zpj.designMode.abstractFactory; public class MobilePhoneA implements MobilePhone{ @Override public void IamMobilePhone() { System.out.println("---i am MobilePhoneA and from FactoryA.-----"); } }
手機接口實現類:MobilePhoneA
package com.zpj.designMode.abstractFactory; public class MobilePhoneB implements MobilePhone{ @Override public void IamMobilePhone() { System.out.println("---i am MobilePhoneB and from FactoryB.-----"); } }
定義工廠接口:Factory
package com.zpj.designMode.abstractFactory; public interface Factory { //工廠中的均可以生產這兩種產品 public Computer createCompulter(); public MobilePhone createMobilePhone(); }
工廠實現類:FactoryA
package com.zpj.designMode.abstractFactory; public class FactoryA implements Factory{ public Computer createCompulter(){ return new ComputerA(); }; public MobilePhone createMobilePhone(){ return new MobilePhoneA(); }; }
工廠實現類:FactoryB
package com.zpj.designMode.abstractFactory; public class FactoryB implements Factory{ public Computer createCompulter(){ return new ComputerB(); }; public MobilePhone createMobilePhone(){ return new MobilePhoneB(); }; }
測試類:
package com.zpj.designMode.abstractFactory; import org.junit.Test; public class AbstructTest { @Test public void test01() { //各個工廠能夠生產各自的產品 Factory factoryA = new FactoryA(); Computer compA = factoryA.createCompulter(); compA.IamComputer(); MobilePhone mpA = factoryA.createMobilePhone(); mpA.IamMobilePhone(); Factory factoryB = new FactoryB(); Computer compB = factoryB.createCompulter(); compB.IamComputer(); MobilePhone mpB = factoryB.createMobilePhone(); mpB.IamMobilePhone(); } }
一、若是須要添加工廠FactoryC,則須要添加一個Factory的實現類:FactoryC和工廠C生產的產品ComputerC和MobilePhoneC便可。可是這裏有個問題,若是FactoryC不生產Computer怎麼辦呢?這是Factory的接口就不能使用了,須要在定義一個新的接口。在客戶端進行調用的時候使用新定義的接口進行對象接收。
二、若是新添加一個產品CDPlayer,則須要添加一個CDPlayer接口,而後添加CDPlayerA和CDPlayerB,同時須要對Factory進行修改,添加createCDPlayer方法,而後再修改全部的Factory實現類。這裏問題就大了,怎麼解決?
這就須要在前期進行接口設計的時候進行詳細分類,同時明確好各個接口中所具備的方法種類,儘可能減小因添加設備而變更的接口數量。沒有完美的設計模式,只有適合的設計模式。
其次還有一種方法:組合簡單工廠模式,也就是取消Factory的定義,客戶端經過簡單工廠模式獲取各類產品的工廠,而後在進行生產。具體簡單工廠怎麼用見:設計模式—簡單工廠
熟練使用各類模式進行組合仍是很重要的!