欧美三区_成人在线免费观看视频_欧美极品少妇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條評論
主站蜘蛛池模板: 四虎4hutv永久在线影院 | 日本一本久道 | 无码国产精品成人午夜视频 | 91情侣在线偷精品国产 | 欧美一性一乱一交 | 精品视频在线免费看 | 日本精品视频在线播放 | 亚洲狠狠婷婷综合久久蜜桃 | 国产中文一区 | 95视频在线播放 | 免费国产免费福利视频 | 久久国产免费看 | 精品国产一区二区在线 | 99久久国产综合精品2020 | 91精品国啪老师啪 | 国产一区中文字幕 | 欧美黄色一区 | 国产色产综合色产在线观看视频 | 黄网站在线免费 | 色偷偷成人网免费视频男人的天堂 | 日日麻批 | 日韩久久一级毛片 | 午夜天堂精品久久久久 | 久久久久久黄 | 北京一级毛片 | 国产资源在线看 | 黄色免费网页 | 亚洲精品美女久久777777 | 久久久久国产精品 | 日韩国产欧美视频 | 12306播播影院午夜 | 国产亚洲精彩视频 | 在线成人免费观看视频 | 日韩电影在线看 | 欧美亚洲理伦电影毛片在线播放 | 国产WW久久久久久久久久 | 天天干天天射天天操 | 日韩国产一区二区 | 日本一区二区三区久久久 | 日本久久中文字幕 | 免费看的黄色 |