回顧: 面向對象設計的基本原則java
1.OCP(開閉原則): 一個應用的實體對擴展開放,對修改關閉.(白話: 如今我有兩個類構建一個功能,若是想要擴展新功能的話,根據原則是不要在原有的兩個類上作修改,從新新建一個類來完成新加的功能)編程
2.DIP(依賴反轉原則): 要針對接口編程,不要針對實現編程(白話: A實現類調用B實現類,具體關係,根據原則B類應當實現接口C類,而後A類與C類發生關係,將具體關係轉爲抽象依賴)數據結構
3.LoD(迪米特法則): 只與朋友通訊.(白話: 該法則的初衷在於下降對象之間的耦合,減小類和類的直接關係,功能的複用,模塊獨立化...更多信息[百度,gooale]查閱)ide
附加: 耦合類型,由高到低 ↓↓↓測試
實現建立和調用的分離, 將選擇實現類、建立對象統一管理和控制.spa
三種工廠模式:設計
建立同一結構類型的任何對象,對於新增的對象,須要修改已有代碼code
建立一個接口Dog對象
public interface Dog { void ability(); }
建立三種Dog,直接上真名了接口
public class 中華田園犬 implements Dog { @Override public void ability() { System.out.println("中華田園犬: 什麼都能吃,聽話,好養,能力強"); } } public class 哈士奇 implements Dog { @Override public void ability() { System.out.println("哈士奇: 吃葷吃素還不知道,這種狗的能力你們都知道"); } } public class 哈巴狗 implements Dog { @Override public void ability() { System.out.println("哈巴狗: 大眼憨厚,聽話好使"); } }
建立工廠類
public class FactoryZone { //第一種方式 public static Dog factoryForDog(String type){ Dog dog=null; if (type.equals("中華田園犬")){ dog=new 中華田園犬(); }else if (type.equals("哈士奇")){ dog=new 哈士奇(); }else if (type.equals("哈巴狗")){ dog=new 哈巴狗(); } //新增的話,須要在此處追加. return dog; } //第二種方式 public Dog get中華田園犬(){ return new 中華田園犬(); } public Dog get哈士奇(){ return new 哈士奇(); } public Dog get哈巴狗(){ return new 哈巴狗(); } }
測試 FactoryMain
public class FactoryMain { public static void main(String[] args) { //無工廠模式,這種狀況下FactoryMain依賴Dog接口以及中華田園犬類,哈士奇類,哈巴狗類 Dog dog=new 中華田園犬(); dog.ability(); Dog dog1=new 哈士奇(); dog1.ability(); Dog dog2=new 哈巴狗(); dog2.ability(); //簡單工廠模式,這種狀況下FactoryMain依賴FactoryZone以及Dog接口 //內部FactoryZone依賴Dog接口以及中華田園犬類,哈士奇類,哈巴狗類 //總體關係複雜,調用者簡單 FactoryZone.factoryForDog("中華田園犬").ability(); FactoryZone.factoryForDog("哈士奇").ability(); FactoryZone.factoryForDog("哈巴狗").ability(); } }
建立同一結構類型的固定對象,能夠新增任何對象
建立 DogFactory接口
public interface DogFactory { Dog getDog(); }
建立不一樣的生產工廠
public class 中華田園犬Factory implements DogFactory { @Override public Dog getDog() { return new 中華田園犬(); } } public class 哈士奇Factory implements DogFactory { @Override public Dog getDog() { return new 哈士奇(); } } public class 哈巴狗Factory implements DogFactory { @Override public Dog getDog() { return new 哈巴狗(); } } 若是新增了其餘的Dog的時候,須要新增另外的類xxFactory implements DogFactory 該設計符合開閉原則,若是不少Dog的話,就也要加不少的xxFactory類
public class FactoryMain { public static void main(String[] args) { //工廠方式模式,FactoryMain依賴DogFactory以及中華田園犬Factory(),哈士奇Factory(),哈巴狗Factory() //DogFactory依賴Dog接口以及中華田園犬類,哈士奇類,哈巴狗類 DogFactory dogFactory = new 中華田園犬Factory(); dogFactory.getDog().ability(); DogFactory dogFactory1 = new 哈士奇Factory(); dogFactory1.getDog().ability(); DogFactory dogFactory2 = new 哈巴狗Factory(); dogFactory2.getDog().ability(); } }
理論和實際老是相差些什麼,正常狀況下,仍是使用簡單工廠會多點.
建立不一樣產品族的任何對象,不能夠新增新單個對象,能夠新增不一樣產品族,用到這種模式說明項目體系比較大了,引用某大大的一張圖作記錄,該模式是工廠的工廠,根據下圖創建理解思惟,代碼省略:
-----------------------------------------------------------