亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

JAVA設(shè)計(jì)模式---簡(jiǎn)單工廠模式

系統(tǒng) 2293 0

舉兩個(gè)例子以快速明白Java中的 簡(jiǎn)單 工廠模式:

1、女媧摶土造人
話說:“天地開辟,未有人民,女媧摶土為人。”女媧需要用土造出一個(gè)個(gè)的人,但在女媧造出人之前,人的概念只存在于女媧的思想里面。
女媧造人,這就是簡(jiǎn)單工廠模式的應(yīng)用。
?


  首先,在這個(gè)造人的思想里面,有幾個(gè)重要的角色:女媧本身、抽象的人的概念和女媧所造出的一個(gè)個(gè)具體的人。
  1.)女媧是一個(gè)工廠類,也就是簡(jiǎn)單工廠模式的核心角色。

????????2.)具休的一個(gè)個(gè)的人,包括張三,李四等。這些人便是簡(jiǎn)單工廠模式里面的具體產(chǎn)品角色
  3.)抽象的人是最早只存在于女媧的頭腦里的一個(gè)想法,女媧按照這個(gè)想法造出的一個(gè)個(gè)具體的人,便都符合這個(gè)抽象的人的定義。換言之,這個(gè)抽象的想法規(guī)定了所有具體的人必須都有的接口(特征或者功能)
   其UML類圖出下所示:
JAVA設(shè)計(jì)模式---簡(jiǎn)單工廠模式
理解了上面的這些東西,再來理解下面的例子,對(duì)照理解,相信看完這篇文章,便對(duì)java簡(jiǎn)單工廠模式有一個(gè)很好的理解:


2、有一個(gè)農(nóng)場(chǎng)公司,專門向市場(chǎng)銷售各類水果,在這個(gè)系統(tǒng)里需要描述下列水果:
     葡萄 Grape
     草莓 Stuawberry
     蘋果 Apple
水果與其他植物不同,最終可以采摘食用,那么一個(gè)自然的做法是建立一個(gè)各種水果都適用的接口,以便與其他農(nóng)場(chǎng)里的植物區(qū)分開來,
JAVA設(shè)計(jì)模式---簡(jiǎn)單工廠模式
此時(shí),則是為水果類聲明了一個(gè)接口,表現(xiàn)在代碼上:

?1 ? ? public ? ? ? interface ? ?Fruit ? {
?2 ? ???? ? // ? 生長(zhǎng) ?
?3 ? ? ????? ? void ? ?grow();
?4 ? ????? ? // ? 收獲 ?
?5 ? ? ????? ? void ? ?harvest();
?6 ? ????? ? // ? 種植 ?
?7 ? ? ????? ? void ? ?plant();
?8 ? } ?

?9 ? ?
10 ?


水果接口規(guī)定出所有的水果必須實(shí)現(xiàn)的接口,包括任何水果類必須具備的方法plant(),grow(),和harvest();

Apple類是水果類的一種,因此它實(shí)現(xiàn)了水果接口所聲明的所有方法。另處,由于蘋果是多年生植物,因此多出一個(gè)treeAge性質(zhì),描述蘋果的樹齡。代碼如下所示:

? package ? ?fac;

? public ? ? ? class ? ?Apple? ? implements ? ?Fruit ? { ? // ? 通過implements實(shí)現(xiàn)接口Fruit ?
?
???? ? private ? ? ? int ? ?treeAge;
????
????
? public ? ? ? void ? ?grow() ? {
????????log(
? " ? Apple?is?growing ? " ? );
????}
?

????
????
? public ? ? ? void ? ?harvest() ? {
????????log(
? " ? Apple?has?been?harvested ? " ? );
????}
?

????
????
? public ? ? ? void ? ?plant() ? {
????????log(
? " ? Apple?ha?been?planted ? " ? );
????}
?

????
????
? public ? ? ? static ? ? ? void ? ?log(String?msg) ? {
????????System.out.println(msg);
????}
?

????
????
? public ? ? ? int ? ?getTreeAge() ? {
????????
? return ? ?treeAge;
????}
?

????
????
? public ? ? ? void ? ?setTreeAge( ? int ? ?treeAge) ? {
????????
? this ? .treeAge ? = ? treeAge;
????}
?

}
?


同理,葡萄 Grape:

package ?fac;

public ? class ?Grape? implements ?Fruit {
????
private ? boolean ?seedless;
????
public ? void ?grow() {
????????log(
" Grape?is?growing . " );
????}

????
????
public ? void ?harvest() {
????????log(
" Grape?has?been?harvested " );
????}

????
????
public ? void ?plant() {
????????log(
" Grape?ha?been?planted " );
????}

????
????
public ? static ? void ?log(String?msg) {
????????System.out.println(msg);
????}


????
public ? boolean ?isSeedless()? {
????????
return ?seedless;
????}


????
public ? void ?setSeedless( boolean ?seedless)? {
????????
this .seedless? = ?seedless;
????}

????

}


草莓 Stuawberry:

package ?fac;

public ? class ?Strawberry? implements ?Fruit {
????
public ? void ?grow() {
????????log(
" Strawberry?is?growing " );
????}

????
????
public ? void ?harvest() {
????????log(
" Strawberry?has?been?harvested " );
????}

????
????
public ? void ?plant() {
????????log(
" Strawberry?has?been?planted " );
????}

????
????
public ? static ? void ?log(String?msg) {
????????System.out.println(msg);
????}

}



農(nóng)場(chǎng)園丁也是系統(tǒng)的一部分,由一個(gè)類來代表,F(xiàn)ruitGardener類,代碼如下:

package ?fac;

public ? class ?FruitGardener {
????
public ? static ?Fruit?factory(String?which) throws ?Exception {
????????
if (which.equalsIgnoreCase( " apple " )) {
????????????
return ? new ?Apple();
????????}
else ? if (which.equalsIgnoreCase( " strawberry " )) {
????????????
return ? new ?Strawberry();
????????}
else ? if ?(which.equalsIgnoreCase( " grape " )) {
????????????
return ? new ?Grape();
????????}
else {
????????????
throw ? new ?Exception( " Bad?fruit?request " );
????????}

????}

}

這時(shí)有人來果園玩,和園丁說,給我們介紹下你的水果吧。于是園丁:

package ?fac;

public ? class ?People? {

????
public ? static ? void ?main(String[]?args)? throws ?Exception? {
????????FruitGardener?fg
= new ?FruitGardener();
????????Fruit?ap
= fg.factory( " Apple " );
????????ap.grow();
????????Fruit?gp
= fg.factory( " Grape " );
????????gp.plant();
????????
????????Fruit?dd
= fg.factory( " ddd " ); // 拋出Bad?fruit?request異常
????}
????

}


(注:以上代碼在JDK5.0,Myeclise3.2下編譯通過)

?

?類比兩個(gè)例子,園丁就相當(dāng)于女媧,而水果就相當(dāng)于具體的人,接口水果類就相當(dāng)于存在于類女媧思想里的人的抽象概念。

由以上兩個(gè)例子可得出,簡(jiǎn)單工廠模式需要由以下角色組成:
      接口
????????????????????????接口的實(shí)現(xiàn)類(簡(jiǎn)單工廠模式里面的具體產(chǎn)品角色)
????????????????????????工廠

理解了以下兩個(gè)例子,再來看第三個(gè)例子:
注意對(duì)比以下三個(gè)實(shí)例的不同
實(shí)例1:

package ?org.jzkangta.factorydemo01;
// 定義接口
interface ?Car {
????
public ? void ?run();
????
public ? void ?stop();
}

// 具體實(shí)現(xiàn)類
class ?Benz? implements ?Car {
????
public ? void ?run() {
????????System.out.println(
" Benz開始啟動(dòng)了。。。。。 " );
????}

????
public ? void ?stop() {
????????System.out.println(
" Benz停車了。。。。。 " );
????}

}

// 具體實(shí)現(xiàn)類
class ?Ford? implements ?Car {
????
public ? void ?run() {
????????System.out.println(
" Ford開始啟動(dòng)了。。。 " );
????}

????
public ? void ?stop() {
????????System.out.println(
" Ford停車了。。。。 " );
????}

}

// 工廠
class ?Factory {
????
public ? static ?Car?getCarInstance() {
????????
return ? new ?Ford();
????}

}

public ? class ?FactoryDemo01? {

????
public ? static ? void ?main(String[]?args)? {
????????Car?c
= Factory.getCarInstance();
????????c.run();
????????c.stop();

????}


}


實(shí)例二:

package ?fac;


// 定義接口
interface ?Car {
????
public ? void ?run();
????
public ? void ?stop();
}

// 具體實(shí)現(xiàn)類
class ?Benz? implements ?Car {
????
public ? void ?run() {
????????System.out.println(
" Benz開始啟動(dòng)了。。。。。 " );
????}

????
public ? void ?stop() {
????????System.out.println(
" Benz停車了。。。。。 " );
????}

}


class ?Ford? implements ?Car {
????
public ? void ?run() {
????????System.out.println(
" Ford開始啟動(dòng)了。。。 " );
????}

????
public ? void ?stop() {
????????System.out.println(
" Ford停車了。。。。 " );
????}

}

// 工廠
class ?Factory {
????
public ? static ?Car?getCarInstance(String?type) {
????????Car?c
= null ;
????????
if ( " Benz " .equals(type)) {
????????????c
= new ?Benz();
????????}

????????
if ( " Ford " .equals(type)) {
????????????c
= new ?Ford();
????????}

????????
return ?c;
????}

}



public ? class ?FactoryDemo02? {

????
public ? static ? void ?main(String[]?args)? {
????????Car?c
= Factory.getCarInstance( " Benz " );
????????
if (c != null ) {
????????????c.run();
????????????c.stop();
????????}
else {
????????????System.out.println(
" 造不了這種汽車。。。 " );
????????}

????????

????}


}



實(shí)例三:

interface ?Car {
????
public ? void ?run();
????
public ? void ?stop();
}


class ?Benz? implements ?Car {
????
public ? void ?run() {
????????System.out.println(
" Benz開始啟動(dòng)了。。。。。 " );
????}

????
public ? void ?stop() {
????????System.out.println(
" Benz停車了。。。。。 " );
????}

}


class ?Ford? implements ?Car {
????
public ? void ?run() {
????????System.out.println(
" Ford開始啟動(dòng)了。。。 " );
????}

????
public ? void ?stop() {
????????System.out.println(
" Ford停車了。。。。 " );
????}

}


class ?Toyota? implements ?Car {
????
public ? void ?run() {
????????System.out.println(
" Toyota開始啟動(dòng)了。。。 " );
????}

????
public ? void ?stop() {
????????System.out.println(
" Toyota停車了。。。。 " );
????}

}


class ?Factory {
????
public ? static ?Car?getCarInstance(String?type) {
????????Car?c
= null ;
????????
try ? {
????????????c
= (Car)Class.forName( " org.jzkangta.factorydemo03. " + type).newInstance();// 利用反射得到汽車類型
????????}
? catch ?(InstantiationException?e)? {
????????????
// ?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
? catch ?(IllegalAccessException?e)? {
????????????
// ?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
? catch ?(ClassNotFoundException?e)? {
????????????
// ?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}

????
????????
return ?c;
????}

}

public ? class ?FactoryDemo03? {

????
public ? static ? void ?main(String[]?args)? {
????????Car?c
= Factory.getCarInstance( " Toyota " );
????????
if (c != null ) {
????????????c.run();
????????????c.stop();
????????}
else {
????????????System.out.println(
" 造不了這種汽車。。。 " );
????????}

????????

????}


}




對(duì)比三個(gè)實(shí)例:
實(shí)例一,雖然實(shí)現(xiàn)了簡(jiǎn)單工廠,但每次只能得到一種汽車,如果我們想換一種,就得修改工廠,太不方便,而實(shí)例二則改變了這種情況,便得我們可以按照我們的需要更換汽車,但我們所更換的汽車必須是實(shí)現(xiàn)類中有的,如果我們想要增加一種汽車的時(shí)候,我們還是得更改工廠,通過改進(jìn),實(shí)例三利用反射機(jī)制,得到汽車類型,這樣當(dāng)我們需要增加一種新的汽車時(shí),就無需要再修改工廠,而只需要增加要實(shí)現(xiàn)的類即可。也就是說要增加什么樣的汽車直接增加這個(gè)汽車的類即可,而無需改變工廠。從而達(dá)到了工廠分離的效果。?

(本文參考《java與模式》及〈浪曦〉視頻教程,并引用了相關(guān)實(shí)例)

JAVA設(shè)計(jì)模式---簡(jiǎn)單工廠模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美成人伊人十综合色 | 99麻豆久久久国产精品免费 | 国产成人亚洲精品2020 | 色综合欧美综合天天综合 | 欧美日韩亚洲国产 | 久久精品国产精品亚洲精品 | 国产精久久一区二区三区 | 久久久一区二区三区不卡 | 成人在激情在线视频 | 成人一区专区在线观看 | 中文字幕在线综合 | 人人干在线观看 | 亚洲爱爱天堂 | 一级毛片一级毛片一级级毛片 | 亚洲精品久久久久影院 | 国产极品嫩模在线观看91精品 | 日本免费黄色小视频 | 抱着cao才爽视频 | 国产精品欧美亚洲韩国日本 | 久久黑丝 | 久久爱综合网 | 欧美成人毛片一级在线 | 天天怕夜夜怕狠狠怕 | 国产免费专区 | 国产香蕉尹人综合在线 | 一区二区不卡 | 亚洲国产精品免费视频 | 综合久久久久久 | 女人一级毛片 | 久久99热精品 | 亚洲欧美国产高清va在线播放 | 亚洲精品爱爱久久 | 九九国产在线 | 韩国三日本三级中文字幕 | 91在线看片 | 亚洲一区二区成人 | 久久视频在线观看免费 | 黄色免费看网站 | 男女羞羞视频免费观看 | 亚洲四虎永久在线播放 | 亚洲精品久久久中文字 |