日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式-Factory Method Pattern

發(fā)布時(shí)間:2023/12/9 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式-Factory Method Pattern 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

一、?工廠方法(Factory Method)模式

工廠方法(FactoryMethod)模式是類的創(chuàng)建模式,其用意是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類中。

工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。

在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個(gè)核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類被實(shí)例化這種細(xì)節(jié)。這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。

在Factory Method模式中,工廠類與產(chǎn)品類往往具有平行的等級(jí)結(jié)構(gòu),它們之間一一對(duì)應(yīng)。

二、?Factory Method模式角色與結(jié)構(gòu):

?

抽象工廠(Creator)角色:是工廠方法模式的核心,與應(yīng)用程序無(wú)關(guān)。任何在模式中創(chuàng)建的對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口。

具體工廠(Concrete Creator)角色:這是實(shí)現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。在上圖中有兩個(gè)這樣的角色:BulbCreator與TubeCreator。

抽象產(chǎn)品(Product)角色:工廠方法模式所創(chuàng)建的對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口。在上圖中,這個(gè)角色是Light。

具體產(chǎn)品(Concrete Product)角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門(mén)的具體工廠創(chuàng)建,它們之間往往一一對(duì)應(yīng)。

三、?程序舉例:

using ?System;

public ? abstract ??? class ?Light
{
???
public?abstract?void?TurnOn();
???
public?abstract?void?TurnOff();
}


public ? class ?BulbLight?:?Light
{
???
public?override?void?TurnOn()
???
{?Console.WriteLine("Bulb?Light?is?Turned?on");?}

???
public?override?void?TurnOff()
???
{?Console.WriteLine("Bulb?Light?is?Turned?off");?}
}


public ? class ?TubeLight?:?Light
{
???
public?override?void?TurnOn()
???
{?Console.WriteLine("Tube?Light?is?Turned?on");?}

???
public?override?void?TurnOff()
???
{?Console.WriteLine("Tube?Light?is?Turned?off");?}
}


public ? abstract ??? class ?Creator
{
???
public?abstract?Light?factory();
}


public ? class ?BulbCreator?:?Creator
{
???
public?override?Light?factory()
???
{?return?new?BulbLight();?}
}


public ? class ?TubeCreator?:?Creator
{
???
public?override?Light?factory()
???
{?return?new?TubeLight();?}
}


public ? class ?Client
{
???
public?static?void?Main()
???
{
??????Creator?c1?
=?new?BulbCreator();
??????Creator?c2?
=?new?TubeCreator();

??????Light?l1?
=?c1.factory();
??????Light?l2?
=?c2.factory();

??????l1.TurnOn();
??????l1.TurnOff();

??????Console.WriteLine(
"-----------------");

??????l2.TurnOn();
??????l2.TurnOff();
???}

}

工廠方法的活動(dòng)序列圖

?

活動(dòng)過(guò)程包括:

客戶端創(chuàng)建BulbCreator對(duì)象,客戶端持有此對(duì)象的類型是Creator,而實(shí)際類型是BulbCreator。然后客戶端調(diào)用 BulbCreator的factory方法,之后BulbCreator調(diào)用BulbLight的構(gòu)造函數(shù)創(chuàng)造出產(chǎn)品BulbLight對(duì)象。


四、?工廠方法模式與簡(jiǎn)單工廠模式

工廠方法模式與簡(jiǎn)單工廠模式再結(jié)構(gòu)上的不同不是很明顯。工廠方法類的核心是一個(gè)抽象工廠類,而簡(jiǎn)單工廠模式把核心放在一個(gè)具體類上。

工廠方法模式之所以有一個(gè)別名叫多態(tài)性工廠模式是因?yàn)榫唧w工廠類都有共同的接口,或者有共同的抽象父類。

當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對(duì)象時(shí),僅僅需要添加一個(gè)具體對(duì)象以及一個(gè)具體工廠對(duì)象,原有工廠對(duì)象不需要進(jìn)行任何修改,也不需要修改客戶端,很好的符合了"開(kāi)放-封閉"原則。而簡(jiǎn)單工廠模式在添加新產(chǎn)品對(duì)象后不得不修改工廠方法,擴(kuò)展性不好。

工廠方法模式退化后可以演變成簡(jiǎn)單工廠模式。

五、?Factory Method模式演化

使用接口或抽象類
抽象工廠角色和抽象場(chǎng)頻角色都可以選擇由接口或抽象類實(shí)現(xiàn)。

使用多個(gè)工廠方法
抽象工廠角色可以規(guī)定出多于一個(gè)的工廠方法,從而使具體工廠角色實(shí)現(xiàn)這些不同的工廠方法,這些方法可以提供不同的商業(yè)邏輯,以滿足提供不同的產(chǎn)品對(duì)象的任務(wù)。

產(chǎn)品的循環(huán)使用
工廠方法總是調(diào)用產(chǎn)品類的構(gòu)造函數(shù)以創(chuàng)建一個(gè)新的產(chǎn)品實(shí)例,然后將這個(gè)實(shí)例提供給客戶端。而在實(shí)際情形中,工廠方法所做的事情可以相當(dāng)復(fù)雜。

一個(gè)常見(jiàn)的復(fù)雜邏輯就是循環(huán)使用產(chǎn)品對(duì)象。工廠對(duì)象將已經(jīng)創(chuàng)建過(guò)的產(chǎn)品登記到一個(gè)聚集中,然后根據(jù)客戶所請(qǐng)求的產(chǎn)品狀態(tài),向聚集查詢。如果有滿足要 求的產(chǎn)品對(duì)象,就直接將產(chǎn)品返回客戶端;如果聚集中沒(méi)有這樣的產(chǎn)品對(duì)象,那么就創(chuàng)建一個(gè)新的滿足要求的產(chǎn)品對(duì)象,然后將這個(gè)對(duì)象登記到聚集中,再返還給客 戶端。"享元模式(Flyweight Pattern)"就是這樣一個(gè)模式。

?

多態(tài)性的喪失和模式的退化
一個(gè)工廠方法模式的實(shí)現(xiàn)依賴于工廠角色和產(chǎn)品角色的多態(tài)性。在有些情況下,這個(gè)模式可以出現(xiàn)退化。

工廠方法返回的類型應(yīng)當(dāng)是抽象類型,而不是具體類型。調(diào)用工廠方法的客戶端應(yīng)當(dāng)依賴抽象產(chǎn)品編程,而不是具體產(chǎn)品。如果工廠僅僅返回一個(gè)具體產(chǎn)品對(duì)象,便違背了工廠方法的用意,發(fā)生退化,這時(shí)就不再是工廠模式了。

工廠的等級(jí)結(jié)構(gòu):工廠對(duì)象應(yīng)當(dāng)有一個(gè)抽象的超類型。如果等級(jí)結(jié)構(gòu)中只有一個(gè)具體工廠類的話,抽象工廠就可以省略,發(fā)生了退化。

六、?Factory Method模式與其它模式的關(guān)系

與工廠方法模式有關(guān)的模式還包括:
模板方法模式、MVC模式、享元模式、備忘錄模式

七、?另外一個(gè)例子

// ?Factory?Method?pattern?--?Real?World?example??

using ?System;
using ?System.Collections;

// ?"Product"
abstract ? class ?Page
{
}


// ?"ConcreteProduct"
class ?SkillsPage?:?Page
{
}


// ?"ConcreteProduct"
class ?EducationPage?:?Page
{
}


// ?"ConcreteProduct"
class ?ExperiencePage?:?Page
{
}


// ?"ConcreteProduct"
class ?IntroductionPage?:?Page
{
}


// ?"ConcreteProduct"
class ?ResultsPage?:?Page
{
}


// ?"ConcreteProduct"
class ?ConclusionPage?:?Page
{
}


// ?"ConcreteProduct"
class ?SummaryPage?:?Page
{
}


// ?"ConcreteProduct"
class ?BibliographyPage?:?Page
{
}


// ?"Creator"
abstract ? class ?Document
{
??
//?Fields
???protected?ArrayList?pages?=?new?ArrayList();

??
//?Constructor
???public?Document()
??
{
????
this.CreatePages();
??}


??
//?Properties
???public?ArrayList?Pages
??
{
????
get{?return?pages;?}
??}


??
//?Factory?Method
???abstract?public?void?CreatePages();
}


// ?"ConcreteCreator"
class ?Resume?:?Document
{
??
//?Factory?Method?implementation
???override?public?void?CreatePages()
??
{
????pages.Add(?
new?SkillsPage()?);
????pages.Add(?
new?EducationPage()?);
????pages.Add(?
new?ExperiencePage()?);
??}

}


// ?"ConcreteCreator"
class ?Report?:?Document
{
??
//?Factory?Method?implementation
???override?public?void?CreatePages()
??
{
????pages.Add(?
new?IntroductionPage()?);
????pages.Add(?
new?ResultsPage()?);
????pages.Add(?
new?ConclusionPage()?);
????pages.Add(?
new?SummaryPage()?);
????pages.Add(?
new?BibliographyPage()?);
??}

}


///?<summary>
///??FactoryMethodApp?test
///?</summary>
class ?FactoryMethodApp
{
??
public?static?void?Main(?string[]?args?)
??
{
????Document[]?docs?
=?new?Document[?2?];

????
//?Note:?constructors?call?Factory?Method
????docs[0]?=?new?Resume();
????docs[
1]?=?new?Report();

????
//?Display?document?pages
?????foreach(?Document?document?in?docs?)
????
{
??????Console.WriteLine(?
" "?+?document?+?"?-------?"?);
??????
foreach(?Page?page?in?document.Pages?)
????????Console.WriteLine(?
"?"?+?page?);
????}

??}

}

參考文獻(xiàn):
閻宏,《Java與模式》,電子工業(yè)出版社
[美]James W. Cooper,《C#設(shè)計(jì)模式》,電子工業(yè)出版社
[美]Alan Shalloway? James R. Trott,《Design Patterns Explained》,中國(guó)電力出版社
[美]Robert C. Martin,《敏捷軟件開(kāi)發(fā)-原則、模式與實(shí)踐》,清華大學(xué)出版社
[美]Don Box, Chris Sells,《.NET本質(zhì)論 第1卷:公共語(yǔ)言運(yùn)行庫(kù)》,中國(guó)電力出版社

轉(zhuǎn)載于:https://my.oschina.net/qihh/blog/57792

總結(jié)

以上是生活随笔為你收集整理的设计模式-Factory Method Pattern的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。