C# 設(shè)計(jì)模式系列教程-抽象工廠模式
1. 概述
抽象工廠模式為一個(gè)產(chǎn)品家族提供了統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個(gè)產(chǎn)品家族的某一系列的時(shí)候,可以從抽象工廠中選出相對應(yīng)的系列來創(chuàng)建一個(gè)具體的工廠類別。
2. 抽象工廠模式中的角色
2.1 抽象工廠(AbstractFactory):擔(dān)任這個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用系統(tǒng)商業(yè)邏輯無關(guān)的。
2.2 具體工廠(ConcreteFactory):這個(gè)角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色含有選擇合適的產(chǎn)品對象的邏輯,而這個(gè)邏輯是與應(yīng)用系統(tǒng)的商業(yè)邏輯緊密相關(guān)的。
2.3 抽象產(chǎn)品(AbstractProduct):擔(dān)任這個(gè)角色的類是工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。
2.4 具體產(chǎn)品(ConcreteProduct):抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個(gè)具體產(chǎn)品類的實(shí)例。這是客戶端最終需要的東西,其內(nèi)部一定充滿了應(yīng)用系統(tǒng)的商業(yè)邏輯。
3. 實(shí)例:更換數(shù)據(jù)庫。現(xiàn)有系統(tǒng)使用的是SqlServer數(shù)據(jù)庫,它的Licence是付費(fèi)的,有的客戶想使用免費(fèi)的數(shù)據(jù)庫服務(wù),如Access。有的客戶擁有其它數(shù)據(jù)庫服務(wù)商的Licence,他們也不想使用還要另付費(fèi)的SqlServer。
3.1 解決這個(gè)問題的根本是將應(yīng)用程序與數(shù)據(jù)庫解耦,使得應(yīng)用程序不再依賴某一個(gè)具體的數(shù)據(jù)庫。抽象工廠給我們提供了解決方案。
3.2 實(shí)現(xiàn)類圖
3.3 實(shí)現(xiàn)代碼
3.3.1 抽象工廠類,提供了創(chuàng)建一組相關(guān)或相互依賴的對象的接口。
/// <summary>
/// 抽象工廠類
/// </summary>
public interface IDatabaseFactory
{
IEmployee CreateEmployee();
IUser CreateUser();
}
3.3.2 具體工廠類,提供了創(chuàng)建SqlServer,或Access具體產(chǎn)品的實(shí)現(xiàn)
/// <summary>
/// 與SqlServer相關(guān)產(chǎn)品的實(shí)現(xiàn)
/// </summary>
public class SqlServerDatabaseFactory : IDatabaseFactory
{
public IEmployee CreateEmployee()
{
return new SqlEmployee();
}
public IUser CreateUser()
{
return new SqlUser();
}
}
/// <summary>
/// 與Access相關(guān)產(chǎn)品的實(shí)現(xiàn)
/// </summary>
public class AccessDatabaseFactory : IDatabaseFactory
{
public IEmployee CreateEmployee()
{
return new AccessEmployee();
}
public IUser CreateUser()
{
return new AccessUser();
}
}
3.3.3 兩個(gè)抽象產(chǎn)品,分別是IUser和IEmployee
/// <summary>
/// 抽象產(chǎn)品
/// </summary>
public interface IUser
{
User GetUser();
bool SaveUser();
}
/// <summary>
/// 抽象產(chǎn)品
/// </summary>
public interface IEmployee
{
Employee GetEmployee();
bool SaveEmployee();
}
3.3.4 具體產(chǎn)品的實(shí)現(xiàn)
/// <summary>
/// 與SqlServer相關(guān)的具體產(chǎn)品User
/// </summary>
public class SqlUser : IUser
{
public User GetUser()
{
return null;
}
public bool SaveUser()
{
return false;
}
}
/// <summary>
/// 與SqlServer相關(guān)的具體產(chǎn)品Employee
/// </summary>
public class SqlEmployee : IEmployee
{
public SqlEmployee()
{
}
public Employee GetEmployee()
{
return null;
}
public bool SaveEmployee()
{
return false;
}
}
/// <summary>
/// 與Access相關(guān)的具體產(chǎn)品User
/// </summary>
public class AccessUser : IUser
{
public AccessUser()
{
}
public User GetUser()
{
return null;
}
public bool SaveUser()
{
return false;
}
}
/// <summary>
/// 與Access相關(guān)的具體產(chǎn)品Employee
/// </summary>
public class AccessEmployee : IEmployee
{
public AccessEmployee()
{
}
public Employee GetEmployee()
{
return null;
}
public bool SaveEmployee()
{
return false;
}
}
4. 模式總結(jié)
4.1 優(yōu)點(diǎn)
4.1.1 具體產(chǎn)品從客戶代碼中被分離出來
4.1.2 容易改變產(chǎn)品的系列(如SqlServer產(chǎn)品系列,Access產(chǎn)品系列)
4.1.3 將一個(gè)系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建
4.2 缺點(diǎn)
在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口,如增加一種產(chǎn)品Customer變得非常困難。
4.3 實(shí)用范圍
4.3.1 一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。
4.3.2 一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)。
4.3.3 當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
4.3.4 當(dāng)你提供一個(gè)產(chǎn)品類庫,而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)。
以上就是本文的全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持我們。
欄 目:C#教程
下一篇:C#判斷一個(gè)String是否為數(shù)字類型
本文標(biāo)題:C# 設(shè)計(jì)模式系列教程-抽象工廠模式
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6479.html
您可能感興趣的文章
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10TortoiseSVN使用教程
- 01-10C#編程中枚舉類型的使用教程
- 01-10Python設(shè)計(jì)模式編程中的備忘錄模式與對象池模式示例
- 01-10C#中的delegate委托類型基本學(xué)習(xí)教程
- 01-10dotNet中的反射用法入門教程
- 01-10詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
- 01-10解析C#設(shè)計(jì)模式編程中的裝飾者模式
- 01-10簡單了解C#設(shè)計(jì)模式編程中的橋接模式
- 01-10C#編程中使用設(shè)計(jì)模式中的原型模式的實(shí)例講解


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載


