1、簡單工廠
2、工廠方法
3、抽象工廠
簡單工廠和工廠方法這倆個設計模式不做詳細介紹,請各位看官自行百度,有大量的解釋。再次我簡單引用一下其他部落客對這三種模式的了解。
引言
簡單工廠、工廠方法、抽象工廠都屬于設計模式中的建立型模式。其主要功能都是幫助我們把對象的執行個體化部分抽象取了出來,優化了系統的架構,并且增強了系統的擴充性。此篇部落格是筆者對學完這三種模式之後一個小小的總結
簡單工廠
簡單工廠模式的工廠類一般是使用靜态方法,通過接收的參數不同來傳回不同的對象執行個體。不修改代碼的話,是無法擴充的
優點:用戶端可以免除直接建立産品對象的責任,而僅僅是“消費”産品。簡單工廠模式通過這種做法實作了對責任的分割
缺點:由于工廠類集中了所有執行個體的建立邏輯,違反了高内聚責任配置設定原則,将全部建立邏輯集中到了一個工廠類中;它所能建立的類隻能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了
工廠方法
工廠方法是針對每一種産品提供一個工廠類。通過不同的工廠執行個體來建立不同的産品執行個體。在同一等級結構中,支援增加任意産品
優點:允許系統在不修改具體工廠角色的情況下引進新産品
缺點:由于每加一個産品,就需要加一個産品工廠的類,增加了額外的開發量
抽象工廠
抽象工廠是應對産品族概念的。應對産品族概念而生,增加新的産品線很容易,但是無法增加新的産品。比如,每個汽車公司可能要同時生産轎車、貨車、客車,那麼每一個工廠都要有建立轎車、貨車和客車的方法
優點:向用戶端提供一個接口,使得用戶端在不必指定産品具體類型的情況下,建立多個産品族中的産品對象
缺點:增加新的産品等級結構很複雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支援呈現傾斜性
以上是對三種方法的介紹和優缺點描述,接下來我們使用一個執行個體來說明抽象工廠的建立
設計說明
案例如下,手機廠商擁有螢幕和主機闆這倆條生産線,不同的手機廠商生産規格不同的産品(小米公司和蘋果公司)
我們進行分析,倆家手機廠商,倆條生産線生産倆種裝置
1
定義如下,首先我們定義一個抽象的工廠,這個工廠的方法包含
1、建立螢幕
2、建立主機闆
這個抽象工廠的作用主要是讓繼承他的子類 實作這倆個抽象方法
/// <summary>
/// 抽象工廠類:提供建立不同品牌的手機螢幕和手機主機闆
/// </summary>
public abstract class AbstractFactory
{
//工廠生産螢幕
public abstract Screen CreateScreen();
//工廠生産主機闆
public abstract MotherBoard CreateMotherBoard();
}
2
定義手機螢幕和手機主機闆的的抽象方法,因為不同的廠商對産品規格不同,是以定義好抽象的基類,再交由各不同的廠商去實作功能,實作如相
/// <summary>
/// 螢幕抽象類:提供每一品牌的螢幕的繼承
/// </summary>
public abstract class Screen
{
public abstract void print();
}
/// <summary>
/// 主機闆抽象類:提供每一品牌的主機闆的繼承
/// </summary>
public abstract class MotherBoard
{
public abstract void print();
}
不同廠商對螢幕和主機闆的實作類如下:
/// <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
經過上面倆個步驟我們得到了不同商品的實作,現在我們還缺少一個東西,就是不同的商家對自己商品的擷取實作
此時我們應該建立不同商家的工廠類,有倆個商家,我們就建立倆個工廠類,工廠中分别實作建立自己産品
實作的工廠要繼承AbstractFactory
/// 小米手機工廠類
/// </summary>
public class XiaoMiFactory : AbstractFactory
{
/// <summary>
/// 生産小米手機螢幕
/// </summary>
/// <returns></returns>
public override Screen CreateScreen()
{
return new XiaoMiScreen();
}
/// <summary>
/// 生産小米手機主機闆
/// </summary>
/// <returns></returns>
public override MotherBoard CreateMotherBoard()
{
return new XiaoMiMotherBoard();
}
}
/// <summary>
/// 蘋果手機工廠
/// </summary>
public class AppleFactory : AbstractFactory
{
/// <summary>
/// 生産蘋果手機螢幕
/// </summary>
/// <returns></returns>
public override Screen CreateScreen()
{
return new AppleScreen();
}
/// <summary>
/// 生産蘋果手機主機闆
/// </summary>
/// <returns></returns>
public override MotherBoard CreateMotherBoard()
{
return new AppleMotherBoard();
}
}
4
内容建立完成,接下去我們就來進行結果的輸出
//小米工廠生産小米手機的螢幕和主機闆
AbstractFactory xiaomiFactory = new XiaoMiFactory();
Screen xiaomiScreen = xiaomiFactory.CreateScreen();
xiaomiScreen.print();
MotherBoard xiaomiMotherBoard = xiaomiFactory.CreateMotherBoard();
xiaomiMotherBoard.print();
//蘋果工廠生産蘋果手機螢幕和主機闆
AbstractFactory appleFactory = new AppleFactory();
Screen appleScreen = appleFactory.CreateScreen();
appleScreen.print();
MotherBoard appleMotherBoard = appleFactory.CreateMotherBoard();
appleMotherBoard.print();
了解:
不同的商家擁有自己的工廠建立自己的産品
1、首先執行個體化商家工廠
2、建立不同的商品
3、調用商品功能