国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

設(shè)計(jì)模式——工廠模式(Factory)

2019-11-10 20:23:16
字體:
供稿:網(wǎng)友

要想正確理解設(shè)計(jì)模式,首先必須明確它是為了解決什么問題而提出來的。

設(shè)計(jì)模式學(xué)習(xí)筆記

——Shulin

轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/zhshulin

1、概念

           工廠模式定義:實(shí)例化對(duì)象,用工廠方法代替new操作。達(dá)到解耦的目的(避免硬編碼耦合)。工廠方法模式是類的創(chuàng)建模式,又叫做虛擬構(gòu)造子(Virtual Constructor)模式或者多態(tài)性工廠(Polymorphic Factory)模式。

        工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在java程序系統(tǒng)可以說是隨處可見。因?yàn)楣S模式就相當(dāng)于創(chuàng)建實(shí)例對(duì)象的new,我們經(jīng)常要根據(jù)類Class生成實(shí)例對(duì)象,如A a=new A() 工廠模式也是用來創(chuàng)建實(shí)例對(duì)象的,所以以后new時(shí)就要多個(gè)心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會(huì)給你系統(tǒng)帶來更大的可擴(kuò)展性和盡量少的修改量。

       常用的java ee框架:sPRing,Spring容器就是一個(gè)巨大的工廠。

2、目的

       解耦,使程序的擴(kuò)展性更強(qiáng)。

3、舉例說明

        比如現(xiàn)在有2個(gè)工作AWork和BWork,以后可能更多。如果此時(shí)我們使用簡(jiǎn)單工廠方法,那么我們會(huì)設(shè)計(jì)一個(gè)WorkFactory然后實(shí)現(xiàn)一個(gè)靜態(tài)方法,通過參數(shù)來控制生成哪個(gè)工作。看似簡(jiǎn)單工廠也能完成任務(wù),但是如果以后需要加上CWork,那么需要添加CWork實(shí)現(xiàn)類以及修改工廠方法,如果更多,那么會(huì)導(dǎo)致工廠類過于臃腫。因?yàn)楹?jiǎn)單工廠模式只有一個(gè)工廠類,它需要處理所有的創(chuàng)建的邏輯。

 

        這時(shí)候就需要工廠方法模式來處理以上需求。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有的對(duì)象的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做。這個(gè)核心類則搖身一變,成為了一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠子類必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)類應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。

 

        這種進(jìn)一步抽象化的結(jié)果,使這種工廠方法模式可以用來允許系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品,這一特點(diǎn)無疑使得工廠方法模式具有超過簡(jiǎn)單工廠模式的優(yōu)越性。下面就針對(duì)以上需求設(shè)計(jì)UML圖:

從上圖可以看出,這個(gè)使用的工廠方法模式的系統(tǒng)涉及到以下角色:

 

  抽象工廠(IWorkFactory)角色:擔(dān)任這個(gè)角色的是工廠方法模式的核心,任何在模式中創(chuàng)建對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口。在實(shí)際的系統(tǒng)中,這個(gè)角色也常常使用抽象類實(shí)現(xiàn)。

 

  具體工廠(AWorkFactory、BWorkFactory)角色:擔(dān)任這個(gè)角色的是實(shí)現(xiàn)了抽象工廠接口的具體JAVA類。具體工廠角色含有與業(yè)務(wù)密切相關(guān)的邏輯,并且受到使用者的調(diào)用以創(chuàng)建工作類。

 

  抽象工作(IWork)角色:工廠方法模式所創(chuàng)建的對(duì)象的超類,也就是所有工作類的共同父類或共同擁有的接口。在實(shí)際的系統(tǒng)中,這個(gè)角色也常常使用抽象類實(shí)現(xiàn)。

 

  具體工作(AWork和BWork)角色:這個(gè)角色實(shí)現(xiàn)了抽象(ExportFile)角色所聲明的接口,工廠方法模式所創(chuàng)建的每一個(gè)對(duì)象都是某個(gè)具體工作角色的實(shí)例。

4、源代碼

抽象工作類:

[java] view plain copy print?public interface IWork {      public void doWork();  }  具體工作類:

[java] view plain copy print?public class AWork implements IWork {      @Override      public void doWork() {          System.out.println("做的是A工作!");      }  }  [java] view plain copy print?public class BWork implements IWork {      @Override      public void doWork() {          System.out.println("做的是B工作!");      }  }  

抽象工廠:

[java] view plain copy print?public interface IWorkFactory {      public IWork createWork();  }  具體工廠:[java] view plain copy print?public class AWorkFactory implements IWorkFactory {        @Override      public IWork createWork() {          return new AWork();      }    }  [java] view plain copy print?public class BWorkFactory implements IWorkFactory {        @Override      public IWork createWork() {          return new BWork();      }    }  

客戶端角色類源代碼:

[java] view plain copy print?public class Test {        public static void main(String[] args) {          IWorkFactory aWorkFactory = new AWorkFactory();          IWork aWork = aWorkFactory.createWork();          aWork.doWork();                    IWorkFactory bWorkFactory = new BWorkFactory();          IWork bWork = bWorkFactory.createWork();          bWork.doWork();      }    }  

5、工廠模式和簡(jiǎn)單工廠模式

          工廠方法模式和簡(jiǎn)單工廠模式在結(jié)構(gòu)上的不同很明顯。工廠方法模式的核心是一個(gè)抽象工廠類,而簡(jiǎn)單工廠模式把核心放在一個(gè)具體類上。

  工廠方法模式退化后可以變得很像簡(jiǎn)單工廠模式。設(shè)想如果非常確定一個(gè)系統(tǒng)只需要一個(gè)具體工廠類,那么不妨把抽象工廠類合并到具體工廠類中去。由于只有一個(gè)具體工廠類,所以不妨將工廠方法改為靜態(tài)方法,這時(shí)候就得到了簡(jiǎn)單工廠模式。

 

  如果系統(tǒng)需要加入一個(gè)新的工作CWork,那么所需要的就是向系統(tǒng)中加入一個(gè)這個(gè)導(dǎo)類以及所對(duì)應(yīng)的工廠類。沒有必要修改客戶端,也沒有必要修改抽象工廠角色或者其他已有的具體工廠角色。對(duì)于增加新的導(dǎo)出類型而言,這個(gè)系統(tǒng)完全支持“開-閉原則”。

(原文地址:http://blog.csdn.net/zhshulin/article/details/38339085)
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 甘谷县| 塔河县| 石嘴山市| 乡宁县| 浪卡子县| 吉安市| 扎囊县| 凌海市| 普安县| 比如县| 义马市| 沂南县| 东阿县| 瓦房店市| 阳信县| 西乌| 湘阴县| 城固县| 岫岩| 汽车| 济南市| 江孜县| 工布江达县| 双桥区| 普定县| 南投县| 柘城县| 长葛市| 富阳市| 元氏县| 辽阳市| 凉山| 五莲县| 行唐县| 柞水县| 称多县| 进贤县| 石阡县| 宁乡县| 新野县| 姜堰市|