隨筆-11  評(píng)論-0  文章-0  trackbacks-0

          工廠方法模式(Factory Method)

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

          請(qǐng)看例子:

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

          兩個(gè)實(shí)現(xiàn)類:

          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. }  

          兩個(gè)工廠類:

          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. }  

          在提供一個(gè)接口:

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

          測(cè)試類:

          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. }  

          其實(shí)這個(gè)模式的好處就是,如果你現(xiàn)在想增加一個(gè)功能:發(fā)及時(shí)信息,則只需做一個(gè)實(shí)現(xiàn)類,實(shí)現(xiàn)Sender接口,同時(shí)做一個(gè)工廠類,實(shí)現(xiàn)Provider接口,就OK了,無(wú)需去改動(dòng)現(xiàn)成的代碼。這樣做,拓展性較好!



          2、抽象工廠模式

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

          工廠方法模式: 一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類。    一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。    每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。  抽象工廠模式: 多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類。    一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類。    每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例,也就是創(chuàng)建的是一個(gè)產(chǎn)品線下的多個(gè)產(chǎn)品。         區(qū)別: 工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。    工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。
          工廠方法創(chuàng)建 "一種" 產(chǎn)品,他的著重點(diǎn)在于"怎么創(chuàng)建",也就是說(shuō)如果你開(kāi)發(fā),你的大量代碼很可能圍繞著這種產(chǎn)品的構(gòu)造,初始化這些細(xì)節(jié)上面。也因?yàn)槿绱耍愃频漠a(chǎn)品之間有很多可以復(fù)用的特征,所以會(huì)和模版方法相隨。 

          抽象工廠需要?jiǎng)?chuàng)建一些列產(chǎn)品,著重點(diǎn)在于"創(chuàng)建哪些"產(chǎn)品上,也就是說(shuō),如果你開(kāi)發(fā),你的主要任務(wù)是劃分不同差異的產(chǎn)品線,并且盡量保持每條產(chǎn)品線接口一致,從而可以從同一個(gè)抽象工廠繼承。

          對(duì)于java來(lái)說(shuō),你能見(jiàn)到的大部分抽象工廠模式都是這樣的: ---它的里面是一堆工廠方法,每個(gè)工廠方法返回某種類型的對(duì)象。  比如說(shuō)工廠可以生產(chǎn)鼠標(biāo)和鍵盤。那么抽象工廠的實(shí)現(xiàn)類(它的某個(gè)具體子類)的對(duì)象都可以生產(chǎn)鼠標(biāo)和鍵盤,但可能工廠A生產(chǎn)的是羅技的鍵盤和鼠標(biāo),工廠B是微軟的。  這樣A和B就是工廠,對(duì)應(yīng)于抽象工廠; 每個(gè)工廠生產(chǎn)的鼠標(biāo)和鍵盤就是產(chǎn)品,對(duì)應(yīng)于工廠方法;  用了工廠方法模式,你替換生成鍵盤的工廠方法,就可以把鍵盤從羅技換到微軟。但是用了抽象工廠模式,你只要換家工廠,就可以同時(shí)替換鼠標(biāo)和鍵盤一套。如果你要的產(chǎn)品有幾十個(gè),當(dāng)然用抽象工廠模式一次替換全部最方便(這個(gè)工廠會(huì)替你用相應(yīng)的工廠方法)  所以說(shuō)抽象工廠就像工廠,而工廠方法則像是工廠的一種產(chǎn)品生產(chǎn)線
          posted on 2015-07-20 22:20 wxb1988 閱讀(165) 評(píng)論(0)  編輯  收藏 所屬分類: Design pattern
          主站蜘蛛池模板: 当涂县| 桦川县| 永靖县| 南阳市| 剑阁县| 德惠市| 景宁| 辉县市| 北辰区| 乌海市| 万宁市| 塘沽区| 沽源县| 大连市| 北海市| 米易县| 治县。| 喀什市| 彭阳县| 隆化县| 观塘区| 临夏县| 铜鼓县| 奉贤区| 尉犁县| 漯河市| 垣曲县| 新丰县| 铅山县| 迭部县| 伊春市| 若尔盖县| 随州市| 泽州县| 青阳县| 夹江县| 清水县| 景宁| 栾城县| 遵化市| 中西区|