五個角色:抽象産品角色(AbstractProduct)、具體産品角色(Product)、抽象工廠角色(AbstractFactory)、具體工廠角色(ConcreteFactory)、用戶端(Client)
抽象産品角色(AbstractProduct):聲明産品接口
具體産品角色(Product):實作産品的接口
抽象工廠角色(AbstractFactory):聲明生成對應抽象産品的方法
具體工廠角色(ConcreteFactory):實作生成抽象産品方法,生成産品
用戶端(Client):執行生産并運作産品
實作思路:用戶端調用具體的工廠角色調用具體的産品角色。
類圖:
<a target="_blank" href="http://blog.51cto.com/attachment/201204/162218100.jpg"></a>
應用場景:我們需要在測試環境和正式環境使用不同的日志類寫日志。
日志可以分為兩大類,分别是寫入資料庫和寫入txt檔案的。
其中寫入資料庫的有通過Sql語句寫入MS Sql Server和Linq寫入MongoDB。
寫入Txt有通過Log4Net方式和普通Stream流。
分析:我們建構兩個Factory工廠分别是用與測試環境的日志記錄工廠(MongDB和Stream流)和生 産環境的日志記錄工廠(Mssql和Log4Net)。另外有兩個抽象産品角色是:寫入資料庫、寫入Txt。具體産品角色是MongDB方式、 Stream流、Mssql和Log4Net。
下面我們在控制台程式去示範一下如何使用Abstract Factory Patterns:
一、 抽象産品角色(AbstractProduct):
#region 抽象産品角色
//插入資料庫的抽象産品角色
abstract class DataBaseProduct
{
public abstract void WriteToDatabaseLog();
}
//寫入Txt檔案的抽象産品角色
abstract class TxtProduct
public abstract void WriteLogToTxt();
#endregion
二、具體産品角色(Product):
#region 具體産品角色
//插入資料庫的Sql Server方式産品角色
class LogToSqlProduct : DataBaseProduct
{
public override void WriteToDatabaseLog()
{
Console.WriteLine("通過Sql寫入Sql Server資料庫");
}
}
//插入資料庫的Linq To MongoDb方式産品角色
class LogToMongoDBProduct : DataBaseProduct
Console.WriteLine("通過Linq寫入MongoDB資料庫");
//插入Txt檔案的Log4Net方式産品角色
class LogToLog4NetProduct : TxtProduct
public override void WriteLogToTxt()
Console.WriteLine("通過Log4Net寫入txt檔案");
//插入Txt檔案的Stream方式産品角色
class LogToStreamProduct : TxtProduct
Console.WriteLine("通過Stream寫入txt檔案");
#endregion
三、抽象工廠角色(AbstractFactory):
#region 抽象工廠角色
//日志工廠
abstract class LogFactory
public abstract DataBaseProduct GetDataBaseProduct();
public abstract TxtProduct GetTxtProduct();
四、具體工廠角色(ConcreteFactory):
#region 具體工廠角色
//使用者測試環境的Log記錄工廠類
class TestLogFactory : LogFactory
public override DataBaseProduct GetDataBaseProduct()
return new LogToMongoDBProduct();
public override TxtProduct GetTxtProduct()
return new LogToStreamProduct();
//使用者生産環境的Log記錄工廠類
class ProductionLogFactory : LogFactory
return new LogToSqlProduct();
return new LogToLog4NetProduct();
五、用戶端(Client):
#region 用戶端
class program
static void Main(string[] args)
Console.WriteLine("在測試環境使用日志類記錄日志到資料庫和txt檔案");
LogFactory logfactory = new TestLogFactory();
DataBaseProduct dataProduct = logfactory.GetDataBaseProduct();
TxtProduct txtProduct = logfactory.GetTxtProduct();
dataProduct.WriteToDatabaseLog();
txtProduct.WriteLogToTxt();
Console.WriteLine("---------------------------------------------------------");
Console.WriteLine("在生産環境使用日志類記錄日志到資料庫和txt檔案");
logfactory = new ProductionLogFactory();
dataProduct = logfactory.GetDataBaseProduct();
txtProduct = logfactory.GetTxtProduct();
Console.ReadLine();
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/826999