...............
}
我們工廠(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)方法:
大家可以看出,這其實(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)建模式。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注