1、簡單工廠
2、工廠方法
3、抽象工廠
簡單工廠和工廠方法這倆個設(shè)計模式不做詳細(xì)介紹,請各位看官自行百度,有大量的解釋。再次我簡單引用一下其他博客主對這三種模式的理解。
引言
簡單工廠、工廠方法、抽象工廠都屬于設(shè)計模式中的創(chuàng)建型模式。其主要功能都是幫助我們把對象的實例化部分抽象取了出來,優(yōu)化了系統(tǒng)的架構(gòu),并且增強了系統(tǒng)的擴展性。此篇博客是筆者對學(xué)完這三種模式之后一個小小的總結(jié)
簡單工廠
簡單工廠模式的工廠類一般是使用靜態(tài)方法,通過接收的參數(shù)不同來返回不同的對象實例。不修改代碼的話,是無法擴展的
優(yōu)點:客戶端可以免除直接創(chuàng)建產(chǎn)品對象的責(zé)任,而僅僅是“消費”產(chǎn)品。簡單工廠模式通過這種做法實現(xiàn)了對責(zé)任的分割
缺點:由于工廠類集中了所有實例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個工廠類中;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了
工廠方法
工廠方法是針對每一種產(chǎn)品提供一個工廠類。通過不同的工廠實例來創(chuàng)建不同的產(chǎn)品實例。在同一等級結(jié)構(gòu)中,支持增加任意產(chǎn)品
優(yōu)點:允許系統(tǒng)在不修改具體工廠角色的情況下引進新產(chǎn)品
缺點:由于每加一個產(chǎn)品,就需要加一個產(chǎn)品工廠的類,增加了額外的開發(fā)量
抽象工廠
抽象工廠是應(yīng)對產(chǎn)品族概念的。應(yīng)對產(chǎn)品族概念而生,增加新的產(chǎn)品線很容易,但是無法增加新的產(chǎn)品。比如,每個汽車公司可能要同時生產(chǎn)轎車、貨車、客車,那么每一個工廠都要有創(chuàng)建轎車、貨車和客車的方法
優(yōu)點:向客戶端提供一個接口,使得客戶端在不必指定產(chǎn)品具體類型的情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象
缺點:增加新的產(chǎn)品等級結(jié)構(gòu)很復(fù)雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支持呈現(xiàn)傾斜性
以上是對三種方法的介紹和優(yōu)缺點描述,接下來我們使用一個實例來說明抽象工廠的創(chuàng)建
設(shè)計說明
案例如下,手機廠商擁有屏幕和主板這倆條生產(chǎn)線,不同的手機廠商生產(chǎn)規(guī)格不同的產(chǎn)品(小米公司和蘋果公司)
我們進行分析,倆家手機廠商,倆條生產(chǎn)線生產(chǎn)倆種設(shè)備
1
定義如下,首先我們定義一個抽象的工廠,這個工廠的方法包含
1、創(chuàng)建屏幕
2、創(chuàng)建主板
這個抽象工廠的作用主要是讓繼承他的子類 實現(xiàn)這倆個抽象方法
/// <summary>
/// 抽象工廠類:提供創(chuàng)建不同品牌的手機屏幕和手機主板
/// </summary>
public abstract class AbstractFactory
{
//工廠生產(chǎn)屏幕
public abstract Screen CreateScreen();
//工廠生產(chǎn)主板
public abstract MotherBoard CreateMotherBoard();
}
2
定義手機屏幕和手機主板的的抽象方法,因為不同的廠商對產(chǎn)品規(guī)格不同,所以定義好抽象的基類,再交由各不同的廠商去實現(xiàn)功能,實現(xiàn)如相
/// <summary>
/// 屏幕抽象類:提供每一品牌的屏幕的繼承
/// </summary>
public abstract class Screen
{
public abstract void print();
}
/// <summary>
/// 主板抽象類:提供每一品牌的主板的繼承
/// </summary>
public abstract class MotherBoard
{
public abstract void print();
}
不同廠商對屏幕和主板的實現(xiàn)類如下:
/// <summary>
/// 蘋果手機屏幕
/// </summary>
public class AppleScreen:Screen
{
public override void print()
{
Console.WriteLine("蘋果手機屏幕!");
}
}
/// <summary>
/// 蘋果手機主板
/// </summary>
public class AppleMotherBoard:MotherBoard
{
public override void print()
{
Console.WriteLine("蘋果手機主板!");
}
}
/// <summary>
/// 小米手機屏幕
/// </summary>
public class XiaoMiScreen:Screen
{
public override void print()
{
Console.WriteLine("小米手機屏幕!");
}
}
/// <summary>
/// 小米手機主板類
/// </summary>
public class XiaoMiMotherBoard :MotherBoard
{
public override void print()
{
Console.WriteLine("小米手機主板!");
}
3
經(jīng)過上面?zhèn)z個步驟我們得到了不同商品的實現(xiàn),現(xiàn)在我們還缺少一個東西,就是不同的商家對自己商品的獲取實現(xiàn)
此時我們應(yīng)該建立不同商家的工廠類,有倆個商家,我們就建立倆個工廠類,工廠中分別實現(xiàn)創(chuàng)建自己產(chǎn)品
實現(xiàn)的工廠要繼承AbstractFactory
/// 小米手機工廠類
/// </summary>
public class XiaoMiFactory : AbstractFactory
{
/// <summary>
/// 生產(chǎn)小米手機屏幕
/// </summary>
/// <returns></returns>
public override Screen CreateScreen()
{
return new XiaoMiScreen();
}
/// <summary>
/// 生產(chǎn)小米手機主板
/// </summary>
/// <returns></returns>
public override MotherBoard CreateMotherBoard()
{
return new XiaoMiMotherBoard();
}
}
/// <summary>
/// 蘋果手機工廠
/// </summary>
public class AppleFactory : AbstractFactory
{
/// <summary>
/// 生產(chǎn)蘋果手機屏幕
/// </summary>
/// <returns></returns>
public override Screen CreateScreen()
{
return new AppleScreen();
}
/// <summary>
/// 生產(chǎn)蘋果手機主板
/// </summary>
/// <returns></returns>
public override MotherBoard CreateMotherBoard()
{
return new AppleMotherBoard();
}
}
4
內(nèi)容創(chuàng)建完成,接下去我們就來進行結(jié)果的輸出
//小米工廠生產(chǎn)小米手機的屏幕和主板
AbstractFactory xiaomiFactory = new XiaoMiFactory();
Screen xiaomiScreen = xiaomiFactory.CreateScreen();
xiaomiScreen.print();
MotherBoard xiaomiMotherBoard = xiaomiFactory.CreateMotherBoard();
xiaomiMotherBoard.print();
//蘋果工廠生產(chǎn)蘋果手機屏幕和主板
AbstractFactory appleFactory = new AppleFactory();
Screen appleScreen = appleFactory.CreateScreen();
appleScreen.print();
MotherBoard appleMotherBoard = appleFactory.CreateMotherBoard();
appleMotherBoard.print();
理解:
不同的商家擁有自己的工廠創(chuàng)建自己的產(chǎn)品
1、首先實例化商家工廠
2、創(chuàng)建不同的商品
3、調(diào)用商品功能