隨筆-11  評論-0  文章-0  trackbacks-0

          工廠方法模式(Factory Method)

          簡單工廠模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到工廠方法模式,創建一個工廠接口和創建多個工廠實現類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。

          請看例子:

          1. public interface Sender {  
          2.     public void Send();  
          3. }  

          兩個實現類:

          1. public class MailSender implements Sender {  
          2.     @Override  
          3.     public void Send() {  
          4.         System.out.println("this is mailsender!");  
          5.     }  
          6. }  
          1. public class SmsSender implements Sender {  
          2.   
          3.     @Override  
          4.     public void Send() {  
          5.         System.out.println("this is sms sender!");  
          6.     }  
          7. }  

          兩個工廠類:

          1. public class SendMailFactory implements Provider {  
          2.       
          3.     @Override  
          4.     public Sender produce(){  
          5.         return new MailSender();  
          6.     }  
          7. }  
          1. public class SendSmsFactory implements Provider{  
          2.   
          3.     @Override  
          4.     public Sender produce() {  
          5.         return new SmsSender();  
          6.     }  
          7. }  

          在提供一個接口:

          1. public interface Provider {  
          2.     public Sender produce();  
          3. }  

          測試類:

          1. public class Test {  
          2.   
          3.     public static void main(String[] args) {  
          4.         Provider provider = new SendMailFactory();  
          5.         Sender sender = provider.produce();  
          6.         sender.Send();  
          7.     }  
          8. }  

          其實這個模式的好處就是,如果你現在想增加一個功能:發及時信息,則只需做一個實現類,實現Sender接口,同時做一個工廠類,實現Provider接口,就OK了,無需去改動現成的代碼。這樣做,拓展性較好!



          2、抽象工廠模式

          工廠方法模式和抽象工廠模式不好分清楚,他們的區別如下:

          工廠方法模式: 一個抽象產品類,可以派生出多個具體產品類。    一個抽象工廠類,可以派生出多個具體工廠類。    每個具體工廠類只能創建一個具體產品類的實例。  抽象工廠模式: 多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。    一個抽象工廠類,可以派生出多個具體工廠類。    每個具體工廠類可以創建多個具體產品類的實例,也就是創建的是一個產品線下的多個產品。         區別: 工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。    工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
          工廠方法創建 "一種" 產品,他的著重點在于"怎么創建",也就是說如果你開發,你的大量代碼很可能圍繞著這種產品的構造,初始化這些細節上面。也因為如此,類似的產品之間有很多可以復用的特征,所以會和模版方法相隨。 

          抽象工廠需要創建一些列產品,著重點在于"創建哪些"產品上,也就是說,如果你開發,你的主要任務是劃分不同差異的產品線,并且盡量保持每條產品線接口一致,從而可以從同一個抽象工廠繼承。

          對于java來說,你能見到的大部分抽象工廠模式都是這樣的: ---它的里面是一堆工廠方法,每個工廠方法返回某種類型的對象。  比如說工廠可以生產鼠標和鍵盤。那么抽象工廠的實現類(它的某個具體子類)的對象都可以生產鼠標和鍵盤,但可能工廠A生產的是羅技的鍵盤和鼠標,工廠B是微軟的。  這樣A和B就是工廠,對應于抽象工廠; 每個工廠生產的鼠標和鍵盤就是產品,對應于工廠方法;  用了工廠方法模式,你替換生成鍵盤的工廠方法,就可以把鍵盤從羅技換到微軟。但是用了抽象工廠模式,你只要換家工廠,就可以同時替換鼠標和鍵盤一套。如果你要的產品有幾十個,當然用抽象工廠模式一次替換全部最方便(這個工廠會替你用相應的工廠方法)  所以說抽象工廠就像工廠,而工廠方法則像是工廠的一種產品生產線
          posted on 2015-07-20 22:20 wxb1988 閱讀(166) 評論(0)  編輯  收藏 所屬分類: Design pattern
          主站蜘蛛池模板: 水富县| 夏津县| 威宁| 新源县| 嘉禾县| 晴隆县| 老河口市| 太谷县| 大田县| 缙云县| 马龙县| 巴马| 乌拉特前旗| 石首市| 奉新县| 南京市| 房产| 霸州市| 阿拉善盟| 利津县| 长治县| 甘德县| 柳江县| 象山县| 金塔县| 陕西省| 深水埗区| 西青区| 阳谷县| 榆中县| 吉安市| 新龙县| 博客| 成都市| 天峻县| 隆尧县| 灌南县| 蓝山县| 宁蒗| 宜良县| 昭通市|