欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

JAVA設(shè)計模式---簡單工廠模式

系統(tǒng) 2062 0

舉兩個例子以快速明白Java中的 簡單 工廠模式:

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


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

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


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

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

?9 ? ?
10 ?


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

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

? package ? ?fac;

? public ? ? ? class ? ?Apple? ? implements ? ?Fruit ? { ? // ? 通過implements實現(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)場園丁也是系統(tǒng)的一部分,由一個類來代表,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 " );
????????}

????}

}

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

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下編譯通過)

?

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

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

理解了以下兩個例子,再來看第三個例子:
注意對比以下三個實例的不同
實例1:

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

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

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

}

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

????
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();

????}


}


實例二:

package ?fac;


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

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

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

}


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

????
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(
" 造不了這種汽車。。。 " );
????????}

????????

????}


}



實例三:

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


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

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

}


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

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

}


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

????
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(
" 造不了這種汽車。。。 " );
????????}

????????

????}


}




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

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

JAVA設(shè)計模式---簡單工廠模式


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久91精品 | 天天操夜夜夜 | www.qubook.| 一级a毛片免费观看久久精品 | 久草资源 | 欧美日韩国产在线播放 | 亚洲热久久 | 国产视频日本 | bt日韩| 99色综合| 国产精品视频播放 | 国产成人福利 | 黄色一级小视频 | 四虎4hu| 亚洲欧美天堂综合久久 | 广西美女一级毛片 | 天天看天天摸色天天综合网 | 欧美日韩一区在线观看 | 欧美高清第一页 | 九九热国产精品视频 | 天堂中文在线最新版地址 | 免费污视频 | 奇米视频在线观看 | 波多野结衣在线高清视频 | 黄色日韩视频 | 亚洲成aⅴ人在线观看 | 免费的色网站 | 亚洲精品久久久久综合中文字幕 | 日本午夜大片免费观看视频 | 精品欧美一区二区久久久伦 | 亚洲精品乱码久久久久久久久久 | 91短视频免费观看 | 日韩在线aⅴ免费视频 | 欧美成年网站 | 国产精品一二三区 | 男女在线观看啪网站 | 色婷婷成人做爰A片免费看网站 | 中文字幕精品一区二区三区精品 | 欧美综合国产精品久久丁香 | 免费黄色av| 欧美精品第三页 |