设计模式(二) 工厂模式
2019獨角獸企業重金招聘Python工程師標準>>>
Hello
回顧: 面向對象設計的基本原則
1.OCP(開閉原則): 一個應用的實體對擴展開放,對修改關閉.(白話: 現在我有兩個類構建一個功能,如果想要擴展新功能的話,根據原則是不要在原有的兩個類上做修改,重新新建一個類來完成新加的功能)
2.DIP(依賴反轉原則): 要針對接口編程,不要針對實現編程(白話: A實現類調用B實現類,具體關系,根據原則B類應當實現接口C類,然后A類與C類發生關系,將具體關系轉為抽象依賴)
3.LoD(迪米特法則): 只與朋友通信.(白話: 該法則的初衷在于降低對象之間的耦合,減少類和類的直接關系,功能的復用,模塊獨立化...更多信息[百度,gooale]查閱)
附加: 耦合類型,由高到低?↓↓↓
- 內容耦合: 當一個模塊直接修改或操作另一個模塊的數據時,或一個模塊不通過正常入口而轉入另一個模塊時,該耦合是最高程度的耦合,應該避免使用之
- 公共耦合: 兩個及以上的模塊共同引用一個全局數據項為公共耦合
- 外部耦合: 一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,而且不是通過參數表傳遞該全局變量的信息,為外部耦合
- 控制耦合: 一個模塊通過接口向另一個模塊傳遞一個控制信號,接受信號的模塊根據信號值而進行適當的動作,為控制耦合
- 標記耦合: 若一個模塊A通過接口向兩個模塊B和C傳遞一個公共參數,那么稱模塊B和C之間存在一個標記耦合
- 數據耦合: 模塊之間通過參數來傳遞數據,為數據耦合.數據耦合是最低的一種耦合形式,系統中都存在這種類型的耦合,因為為了完成一些有意義的功能,往往需要將某些模塊的輸出數據作為另一些模塊的輸入數據
- 非直接耦合: 兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的
工廠模式
實現創建和調用的分離, 將選擇實現類、創建對象統一管理和控制.
三種工廠模式:
簡單工廠
創建同一結構類型的任何對象,對于新增的對象,需要修改已有代碼
創建一個接口Dog
public interface Dog {void ability(); }創建三種Dog,直接上真名了
public class 中華田園犬 implements Dog {@Overridepublic void ability() {System.out.println("中華田園犬: 什么都能吃,聽話,好養,能力強");} }public class 哈士奇 implements Dog {@Overridepublic void ability() {System.out.println("哈士奇: 吃葷吃素還不知道,這種狗的能力大家都知道");} }public class 哈巴狗 implements Dog {@Overridepublic 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 {@Overridepublic Dog getDog() {return new 中華田園犬();} }public class 哈士奇Factory implements DogFactory {@Overridepublic Dog getDog() {return new 哈士奇();} }public class 哈巴狗Factory implements DogFactory {@Overridepublic 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();} }理論和實際總是相差些什么,正常情況下,還是使用簡單工廠會多點.
抽象工廠
創建不同產品族的任何對象,不可以新增新單個對象,可以新增不同產品族,用到這種模式說明項目體系比較大了,引用某大大的一張圖做記錄,該模式是工廠的工廠,根據下圖建立理解思維,代碼省略:
?
-----------------------------------------------------------
轉載于:https://my.oschina.net/u/3829444/blog/1813632
總結
以上是生活随笔為你收集整理的设计模式(二) 工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用SpringBoot Actuato
- 下一篇: 从Python脚本判断服务器不可达,到Z