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

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

對(duì)《Java與模式》中工廠(chǎng)方法模式的異議

2019-11-18 10:59:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  關(guān)于工廠(chǎng)方法的一點(diǎn)討論,我們知道工廠(chǎng)方法屬于類(lèi)型創(chuàng)建模式,而抽象工廠(chǎng)屬于對(duì)象創(chuàng)建模式,并且所謂的類(lèi)創(chuàng)建模式就是把創(chuàng)建工作延遲到子類(lèi),而對(duì)象創(chuàng)建模式則將延遲到另一個(gè)對(duì)象。

  并且設(shè)計(jì)模式中指出,類(lèi)模式處理類(lèi)和子類(lèi)子間的關(guān)系,這些關(guān)系通過(guò)繼續(xù)建立,是靜態(tài)的,在編譯時(shí)刻便確定下來(lái)。對(duì)象模式則處理對(duì)象之間的關(guān)系,是動(dòng)態(tài)的,運(yùn)行時(shí)刻是可以變化的,更具動(dòng)態(tài)性。

  工廠(chǎng)方法由于屬于類(lèi)型創(chuàng)建模式,因此它的創(chuàng)建工作由子類(lèi)完成,而不是使用對(duì)象進(jìn)行創(chuàng)建,并且在《設(shè)計(jì)模式》中工廠(chǎng)方法的動(dòng)機(jī)一節(jié)有一個(gè)示例,它的類(lèi)大致如下:

//抽象產(chǎn)品,可以是接口或者抽象類(lèi)
public abstract class document {
public void open(){
...............
...............
}
public void close(){
...............
...............
}
public void save();
}
//具體的產(chǎn)品,
public class Mydocument extends document{
public void open(){
.............
..............
}

...............

}
我們工廠(chǎng)方法
public abstract class appliaction {
//該方法是工廠(chǎng)方法,由子類(lèi)實(shí)現(xiàn)
public abstract document createDocument();

//模板方法,在方法中使用了工廠(chǎng)方法

pubic void newDocument(){

//使用工廠(chǎng)方法,獲得doc,而實(shí)際有子類(lèi)完成,//這里可以看出,對(duì)象的創(chuàng)建,是通過(guò)繼續(xù)來(lái)實(shí)現(xiàn),是靜態(tài)的,編譯時(shí)已經(jīng)確定//而不是通過(guò)對(duì)象的委托來(lái)實(shí)現(xiàn),故屬于類(lèi)創(chuàng)建型模式
Document doc=createDocument();
doc.open();
....................
doc.save();
}
}

  具體的工廠(chǎng)實(shí)現(xiàn)由子類(lèi)來(lái)實(shí)現(xiàn)工廠(chǎng)方法:

public class myappliaction extends appliaction {
public document createDocument(){
return new Mydocument();
}
}

  大家可以看出,這其實(shí)使用template method模式,抽象方法聲明創(chuàng)建對(duì)象,而模板方法完成業(yè)務(wù)邏輯,她使用抽象創(chuàng)建方法,由繼續(xù)來(lái)獲得產(chǎn)品,而不是使用對(duì)象來(lái)創(chuàng)建對(duì)象的。

  并且大家仔細(xì)看<設(shè)計(jì)模式>71頁(yè)的結(jié)構(gòu)圖,里的creator里有兩個(gè)方法,其中一個(gè)使用factorymethod方法,另外一個(gè)就是普通的方法,anOperation它調(diào)用了工廠(chǎng)方法,PRodUCt=factorymethod()來(lái)獲得產(chǎn)品對(duì)象。

  現(xiàn)在問(wèn)題就出現(xiàn)在這里,而另外一本書(shū)閻宏的《java與模式》的167地結(jié)構(gòu)圖中卻沒(méi)有把這點(diǎn)作出標(biāo)記,并且提供的示例,也不像最初<設(shè)計(jì)模式>中的工廠(chǎng)方法的例子,
他的示例如下:

//抽象工廠(chǎng),而這里卻沒(méi)有方法使用工廠(chǎng)方法:
public interface Creator{
/**
* 工廠(chǎng)方法
*/
public Product factory();
}

public class ConcreteCreator1 implements Creator
{
/**
* 工廠(chǎng)方法
*/
public Product factory()
{
return new ConcreteProduct1();
}
}

而客戶(hù)端卻使用;
public static void main(String[] args){
creator1 = new ConcreteCreator1();
prod1 = creator1.factory();
}

  我感覺(jué)這樣示例有問(wèn)題,或者不妥,或者不能表達(dá)原意。

  在客戶(hù)端,他的對(duì)象創(chuàng)建使用了

  prod1 = creator1.factory();

  這樣顯然使用對(duì)象creator1來(lái)創(chuàng)建對(duì)象的,而不是使用繼續(xù),類(lèi)模式來(lái)完成創(chuàng)建的。這與工廠(chǎng)方法的原意,類(lèi)模式,把創(chuàng)建工廠(chǎng)延遲到子類(lèi)實(shí)現(xiàn),等有沖突。

  這樣想對(duì)象創(chuàng)建模式。



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吴江市| 会泽县| 肇源县| 连云港市| 宣城市| 邯郸市| 蛟河市| 灵璧县| 普兰店市| 永顺县| 荥阳市| 济源市| 龙里县| 个旧市| 营山县| 剑河县| 瑞昌市| 商河县| 岳普湖县| 太白县| 资源县| 双城市| 金昌市| 南京市| 马关县| 那曲县| 屏东市| 北辰区| 白城市| 商丘市| 石河子市| 麟游县| 阳信县| 穆棱市| 顺义区| 甘孜县| 石阡县| 筠连县| 巴中市| 防城港市| 苏尼特右旗|