五个角色:抽象产品角色(AbstractProduct)、具体产品角色(Product)、抽象工厂角色(AbstractFactory)、具体工厂角色(ConcreteFactory)、客户端(Client)
抽象产品角色(AbstractProduct):声明产品接口
具体产品角色(Product):实现产品的接口
抽象工厂角色(AbstractFactory):声明生成对应抽象产品的方法
具体工厂角色(ConcreteFactory):实现生成抽象产品方法,生成产品
客户端(Client):执行生产并运行产品
实现思路:客户端调用具体的工厂角色调用具体的产品角色。
类图:
应用场景:我们需要在测试环境和正式环境使用不同的日志类写日志。
日志可以分为两大类,分别是写入数据库和写入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
- {
- public override void WriteToDatabaseLog()
- {
- Console.WriteLine("通过Linq写入MongoDB数据库");
- }
- }
- //插入Txt文件的Log4Net方式产品角色
- class LogToLog4NetProduct : TxtProduct
- {
- public override void WriteLogToTxt()
- {
- Console.WriteLine("通过Log4Net写入txt文件");
- }
- }
- //插入Txt文件的Stream方式产品角色
- class LogToStreamProduct : TxtProduct
- {
- public override void WriteLogToTxt()
- {
- Console.WriteLine("通过Stream写入txt文件");
- }
- }
- #endregion
三、抽象工厂角色(AbstractFactory):
- #region 抽象工厂角色
- //日志工厂
- abstract class LogFactory
- {
- public abstract DataBaseProduct GetDataBaseProduct();
- public abstract TxtProduct GetTxtProduct();
- }
- #endregion
四、具体工厂角色(ConcreteFactory):
- #region 具体工厂角色
- //用户测试环境的Log记录工厂类
- class TestLogFactory : LogFactory
- {
- public override DataBaseProduct GetDataBaseProduct()
- {
- return new LogToMongoDBProduct();
- }
- public override TxtProduct GetTxtProduct()
- {
- return new LogToStreamProduct();
- }
- }
- //用户生产环境的Log记录工厂类
- class ProductionLogFactory : LogFactory
- {
- public override DataBaseProduct GetDataBaseProduct()
- {
- return new LogToSqlProduct();
- }
- public override TxtProduct GetTxtProduct()
- {
- return new LogToLog4NetProduct();
- }
- }
- #endregion
五、客户端(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();
- dataProduct.WriteToDatabaseLog();
- txtProduct.WriteLogToTxt();
- Console.ReadLine();
- }
- }
- #endregion
如需源码请点击 AbstractFactoryPattern.rar 下载。
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826999