更新時(shí)間:2022-06-08 10:00:57 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1152次
工廠模式是“工廠是用于創(chuàng)建其他對(duì)象的對(duì)象”。簡(jiǎn)單工廠模式是Factory最簡(jiǎn)單形式的類(lèi)(與工廠方法模式或抽象工廠模式相比)。換句話說(shuō),我們可以說(shuō):在簡(jiǎn)單工廠模式中,我們有一個(gè)工廠類(lèi),它有一個(gè)方法可以根據(jù)給定的輸入返回不同類(lèi)型的對(duì)象。
讓我們通過(guò)一個(gè)例子來(lái)理解:
為了實(shí)際理解簡(jiǎn)單工廠模式,我們以制造不同類(lèi)型風(fēng)扇的電氣公司為例,我們將其稱(chēng)為FanFactory。但首先,我們將在不使用簡(jiǎn)單工廠模式的情況下實(shí)現(xiàn)此場(chǎng)景,然后會(huì)看到問(wèn)題以及如何使用此模式解決這些問(wèn)題。
下面的程序是一個(gè)簡(jiǎn)單的控制臺(tái)應(yīng)用程序,在這個(gè)程序中,Main方法用作創(chuàng)建一個(gè)TableFan. 在最簡(jiǎn)單的實(shí)現(xiàn)中,我們可以看到客戶(hù)端能夠TableFan根據(jù)需要直接創(chuàng)建一個(gè)(無(wú)需任何工廠)。
class Program
{
static void Main(string[] args)
{
TableFan fan = new TableFan();
fan.SwitchOn();
}
}
class TableFan { }
在上面的示例中,我們沒(méi)有使用任何模式并且應(yīng)用程序運(yùn)行良好。但是如果我們考慮未來(lái)可能的變化并仔細(xì)觀察,我們可以預(yù)見(jiàn)到當(dāng)前實(shí)現(xiàn)存在以下問(wèn)題:
在當(dāng)前的應(yīng)用程序中,無(wú)論哪里需要特定的風(fēng)扇,它都是使用具體類(lèi)創(chuàng)建的。將來(lái),如果有任何更改是類(lèi)名/提出了不同的具體類(lèi),您必須在整個(gè)應(yīng)用程序中進(jìn)行更改。例如TableFan,我們不需要引入類(lèi),而是引入BasicTableFan(現(xiàn)在應(yīng)該使用它來(lái)代替舊TableFan類(lèi))和PowerTableFan類(lèi)。因此,對(duì)Fan類(lèi)的任何更改都會(huì)使代碼難以維護(hù),并且需要在許多地方進(jìn)行許多更改。
目前,當(dāng)客戶(hù)端創(chuàng)建TableFan對(duì)象時(shí),TableFan類(lèi)的構(gòu)造函數(shù)不帶任何參數(shù),因此Fan創(chuàng)建過(guò)程很容易。但是后來(lái)TableFan的對(duì)象創(chuàng)建過(guò)程發(fā)生了變化,如果Fan類(lèi)的構(gòu)造函數(shù)期望兩個(gè)對(duì)象作為參數(shù)怎么辦。然后代碼客戶(hù)端中的每個(gè)地方都需要在Fan創(chuàng)建對(duì)象的地方進(jìn)行更改。例如:
TableFan fan = new TableFan(Moter moter, BladType bladType);
在創(chuàng)建對(duì)象TableFan fan = new TableFan(Moter moter, BladType bladType);時(shí)的代碼Fan中,它有兩種類(lèi)型Moter,BladType. 在上面的代碼中,客戶(hù)端知道類(lèi),也知道對(duì)象的創(chuàng)建過(guò)程,這應(yīng)該是FanFactory. 我們應(yīng)該避免將此類(lèi)對(duì)象創(chuàng)建細(xì)節(jié)和內(nèi)部類(lèi)暴露給客戶(hù)端應(yīng)用程序。
在某些情況下,必須集中對(duì)已創(chuàng)建對(duì)象的生命周期管理,以確保應(yīng)用程序內(nèi)的行為一致。如果客戶(hù)可以按照自己的意愿自由創(chuàng)建具體對(duì)象,則無(wú)法做到這一點(diǎn)。這種情況經(jīng)常發(fā)生在緩存管理和 DI 框架中。
在 C# 和 Java 中,類(lèi)的構(gòu)造函數(shù)必須與該類(lèi)的名稱(chēng)相同。假設(shè)需要為構(gòu)造函數(shù)提供描述性名稱(chēng),例如CreateTableFanByModelNumber(int modelNumber). 在TableFan課堂上,我們最多可以有一個(gè)類(lèi)似的構(gòu)造函數(shù), Fan(int modelNumber)但名稱(chēng)不像它的意圖那樣具有描述性。另一個(gè)關(guān)于描述性名稱(chēng)問(wèn)題的類(lèi)似示例也可在此維基百科頁(yè)面上找到。
為了解決上述問(wèn)題,我們可以使用簡(jiǎn)單工廠模式,因?yàn)檫@種模式適合解決上述問(wèn)題。此外,我們將繼續(xù)使用相同的示例并修改現(xiàn)有代碼。
當(dāng)我們實(shí)現(xiàn)簡(jiǎn)單工廠模式時(shí),需要?jiǎng)?chuàng)建一個(gè)類(lèi),該類(lèi)將具有返回請(qǐng)求的對(duì)象實(shí)例的方法。讓我們創(chuàng)建一個(gè)名為“ FanFactory”的類(lèi),它將實(shí)現(xiàn)一個(gè)名為“ IFanFactory”的接口。這個(gè)接口有一個(gè)方法被調(diào)用IFan CreateFan(FanType type);,它接受enum FanType并返回 a 的各個(gè)實(shí)例Fan。
現(xiàn)在Client將不知道具體的類(lèi),如TableFanor CeilingFan。客戶(hù)將使用FanType enumand IFan interface。基于在enum調(diào)用“ CreateFan”方法時(shí)作為參數(shù)傳遞,F(xiàn)anFactory將返回所需風(fēng)扇的實(shí)例。以下是修改后的應(yīng)用程序代碼:
enum FanType
{
TableFan,
CeilingFan,
ExhaustFan
}接口IFan
{ void SwitchOn ();
無(wú)效開(kāi)關(guān)();
} class TableFan : IFan {.... } class CeilingFan : IFan {.... } class ExhaustFan : IFan {..... } interface IFanFactory
{
IFan CreateFan(FanType type);
} class FanFactory : IFanFactory
{ public IFan CreateFan(FanType type)
{ switch (type)
{ case
FanType.TableFan:
return new TableFan();
case FanType.CeilingFan:
return new CeilingFan();
case FanType.ExhaustFan:
return new ExhaustFan();
默認(rèn):
返回 新的TableFan();
}
}
} //客戶(hù)端代碼如下:static void Main(string[] args)
{
IFanFactory simpleFactory = new FanFactory();
//
使用簡(jiǎn)單工廠
創(chuàng)建風(fēng)扇 IFan fan = simpleFactory.CreateFan(FanType.TableFan); //使用創(chuàng)建的對(duì)象
fan.SwitchOn();
Console.ReadLine();
}
現(xiàn)在我們將在“沒(méi)有實(shí)現(xiàn)簡(jiǎn)單工廠模式的問(wèn)題”部分確認(rèn)簡(jiǎn)單工廠模式如何解決上述所有問(wèn)題:
現(xiàn)在客戶(hù)端正在使用接口和,所以如果我們更改為給定值創(chuàng)建FanFactory的具體類(lèi)的名稱(chēng),我們只需要在一個(gè)地方進(jìn)行更改,即在“ ”方法內(nèi)部。客戶(hù)端代碼完全不受影響。FanenumCreateFanFanFactory
如果稍后,F(xiàn)an對(duì)象創(chuàng)建過(guò)程發(fā)生變化并且Fan類(lèi)的構(gòu)造函數(shù)期望兩個(gè)或多個(gè)對(duì)象作為參數(shù),我們只需要在 的 " CreateFan" 方法內(nèi)進(jìn)行更改FanFactory。客戶(hù)端代碼完全不受影響。
使用FanFactory,所有內(nèi)部細(xì)節(jié)將對(duì)客戶(hù)隱藏。所以它在抽象和安全方面是好的。
如果需要,我們可以編寫(xiě)生命周期管理邏輯以及集中式對(duì)象創(chuàng)建FanFactory。
在使用時(shí)FanFactory,我們可以簡(jiǎn)單地使用具有不同且更具描述性名稱(chēng)的方法,這些方法將返回IFan. 在我們的示例應(yīng)用程序中,F(xiàn)anFactory可以將公共方法CreateTableFanByModelNumber(int modelNumber)公開(kāi)給客戶(hù)端。
以上就是關(guān)于“簡(jiǎn)單工廠模式的詳細(xì)介紹”,大家如果對(duì)此比較感興趣,想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java設(shè)計(jì)模式,里面有更豐富的知識(shí)等著大家去學(xué)習(xí),相信對(duì)大家會(huì)有所幫助的。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743