1. 程式人生 > >工廠,代理,單例模式的理解

工廠,代理,單例模式的理解

簡單工廠模式:
    1個介面定義方法,
    2個實現類重寫介面方法,
    1個工廠類 定義方法返回型別是介面,但是返回值一般是該介面的實現類,介面是抽象的,不能例項化的,但是介面可以宣告一個引用,指向其實現類。
    1個測試類 建立工廠類物件,呼叫其方法,傳type值,用來確認返回值是改介面哪個實現類。得到的返回值是該介面的實現類,呼叫其方法列印輸出語句。
    
   優缺點:這樣模組清晰化,每個部分都各司其職,分工明確,程式碼就實現最漸層意義上的  “可維護”  啦。 說到缺點,當我們需要增加一產品,
          比如在學習一門新技術時,這樣個小功能我們就要去新增一個新的類,同時我們需要在Factory中改動到switch 裡面的程式碼,
          這是耦合性很高的表現啦!

工廠模式: 
   一個A介面,定義一個方法規範(),返回型別:B介面。這裡A介面相當於工廠的規範條件。
   一個實現類AImpl,重寫方法,返回型別B介面,返回值B介面的實現類,連線的是A介面。這裡相當於一個分廠
   一個B介面,定義一個方法規範(學習技術),返回型別:void
   一個實現類BImpl,重寫方法,要學習的技術,比如python,連線的是B介面
   一個測試類C,建立一個A介面的實現類,呼叫其方法,返回B介面對應的實現類,呼叫其方法,列印輸出。

優缺點:可以設立多個子工廠,而不是所有的產品有單一的工廠來生產,而是給各自特色的子工廠來生產。
        比如:要增加一門新技術,可以建立一個分廠,就是再建立一個AImpl。但是這樣做每增加一門
        技術,相應的也要增加一個子工廠,加大了額外的開發量。

/*抽象工廠:
    *       1.一個A介面 定義一個方法,比如關於前端的,
    *       2.一個AImpl實現類,實現A介面的方法,要學習H5
    *       3.一個B介面 定義一個方法,比如關於後端的,
    *       4.一個BImpl實現類,實現B介面的方法,要學習Java
    *       5.一個抽象類(工廠) 定義兩個抽象方法,返回型別是A介面,B介面
    *       6.一個抽象類的子類(子工廠) 重寫父類的兩個方法,返回值是A介面實現類,B介面實現類
    *       7.一個測試類,建立一個子工廠物件,呼叫兩個方法可以得到兩個不同介面的實現類物件,呼叫其方法,列印輸出。
    * */


   抽象工廠優缺點:可以建立分工廠來增加已知種類的新技術,大大降低了耦合性,但是但出現一種不是已知種類的新種類時
                 就需要建立一個新的介面,就需要改變其工廠類的方法,影響到所有子工廠,必須重寫父類的抽象方法
     
代理模式:代理類與委託類有同樣的介面,代理類主要負責處理資訊,過濾資訊,處理業務呼叫的還是委託類的方法,測試的時 候是建立代理類的物件執行其方法。
優缺點:代理物件必須提前寫出,如果介面發生了變化,代理物件的程式碼也要進行維護。


單例模式
    懶漢:1 私有的建構函式,只限本類使用,
               private 類名(){} 
             2 本類的私有的靜態的屬性(伴隨著類的載入而載入,且只加載一次)
               private static 類名 類物件名 = null;
             3 提供一個物件可以訪問該類公共的靜態的方法
               public static 類名 方法名(){
                    if(類物件名==null){類物件名 = new 類名();}
         		return 類物件名;
                 }
       惡漢:1 private 類名(){} 
    	 2 private static 類名 類物件名 = new 類名();
     	 3 public static 類名 方法名(){ return 類物件名; }
       
        /**
         * 懶漢和餓漢的區別
         * 1,類載入速度  懶漢快,餓漢慢  懶漢載入時不用初始化物件
         * 2,執行時獲取物件的速度   懶漢慢,餓漢快  懶漢呼叫方法時才例項化物件
         * 3,佔用資源情況  懶漢呼叫獲取例項方式才載入物件,餓漢是該類被例項化時一直佔用資源
         */