极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)

五个角色:抽象产品角色(AbstractProduct)、具体产品角色(Product)、抽象工厂角色(AbstractFactory)、具体工厂角色(ConcreteFactory)、客户端(Client) 

         抽象产品角色(AbstractProduct):声明产品接口

         具体产品角色(Product):实现产品的接口

         抽象工厂角色(AbstractFactory):声明生成对应抽象产品的方法

         具体工厂角色(ConcreteFactory):实现生成抽象产品方法,生成产品

         客户端(Client):执行生产并运行产品

实现思路:客户端调用具体的工厂角色调用具体的产品角色。

类图:

极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)

应用场景:我们需要在测试环境和正式环境使用不同的日志类写日志。

                    日志可以分为两大类,分别是写入数据库和写入txt文件的。

                    其中写入数据库的有通过Sql语句写入MS Sql Server和Linq写入MongoDB。

                    写入Txt有通过Log4Net方式和普通Stream流。

分析:我们构建两个Factory工厂分别是用与测试环境的日志记录工厂(MongDB和Stream流)和生 产环境的日志记录工厂(Mssql和Log4Net)。另外有两个抽象产品角色是:写入数据库、写入Txt。具体产品角色是MongDB方式、 Stream流、Mssql和Log4Net。

        下面我们在控制台程序去演示一下如何使用Abstract Factory Patterns:

        一、 抽象产品角色(AbstractProduct):

 


  1. #region 抽象产品角色 
  2.  
  3.  //插入数据库的抽象产品角色 
  4.  abstract class DataBaseProduct 
  5.  { 
  6.      public abstract void WriteToDatabaseLog(); 
  7.  } 
  8.   
  9.  //写入Txt文件的抽象产品角色 
  10.  abstract class TxtProduct 
  11.  { 
  12.      public abstract void WriteLogToTxt(); 
  13.  } 
  14.  
  15.  #endregion 

        二、具体产品角色(Product):

 


  1. #region 具体产品角色 
  2.  
  3. //插入数据库的Sql Server方式产品角色 
  4. class LogToSqlProduct : DataBaseProduct 
  5.     public override void WriteToDatabaseLog() 
  6.     { 
  7.         Console.WriteLine("通过Sql写入Sql Server数据库"); 
  8.     } 
  9.  
  10. //插入数据库的Linq To MongoDb方式产品角色 
  11. class LogToMongoDBProduct : DataBaseProduct 
  12.     public override void WriteToDatabaseLog() 
  13.     { 
  14.         Console.WriteLine("通过Linq写入MongoDB数据库"); 
  15.     } 
  16.  
  17. //插入Txt文件的Log4Net方式产品角色 
  18. class LogToLog4NetProduct : TxtProduct 
  19.     public override void WriteLogToTxt() 
  20.     { 
  21.         Console.WriteLine("通过Log4Net写入txt文件"); 
  22.     } 
  23.  
  24. //插入Txt文件的Stream方式产品角色 
  25.  class LogToStreamProduct : TxtProduct 
  26.     public override void WriteLogToTxt() 
  27.     { 
  28.         Console.WriteLine("通过Stream写入txt文件"); 
  29.     } 
  30.  
  31. #endregion 

        三、抽象工厂角色(AbstractFactory):

 


  1. #region 抽象工厂角色 
  2. //日志工厂 
  3. abstract class LogFactory 
  4.     public abstract DataBaseProduct GetDataBaseProduct(); 
  5.  
  6.     public abstract TxtProduct GetTxtProduct(); 
  7.  
  8. #endregion 

        四、具体工厂角色(ConcreteFactory):

 


  1. #region 具体工厂角色 
  2.  
  3. //用户测试环境的Log记录工厂类 
  4. class TestLogFactory : LogFactory 
  5.     public override DataBaseProduct GetDataBaseProduct() 
  6.     { 
  7.         return new LogToMongoDBProduct(); 
  8.     } 
  9.     public override TxtProduct GetTxtProduct() 
  10.     { 
  11.         return new LogToStreamProduct(); 
  12.     } 
  13.  
  14. //用户生产环境的Log记录工厂类 
  15. class ProductionLogFactory : LogFactory 
  16.     public override DataBaseProduct GetDataBaseProduct() 
  17.     { 
  18.         return new LogToSqlProduct(); 
  19.     } 
  20.     public override TxtProduct GetTxtProduct() 
  21.     { 
  22.         return new LogToLog4NetProduct(); 
  23.     } 
  24.  
  25. #endregion 

        五、客户端(Client):

 


  1. #region 客户端 
  2.  
  3. class program 
  4.     static void Main(string[] args) 
  5.     { 
  6.         Console.WriteLine("在测试环境使用日志类记录日志到数据库和txt文件"); 
  7.         LogFactory logfactory = new TestLogFactory(); 
  8.         DataBaseProduct dataProduct = logfactory.GetDataBaseProduct(); 
  9.         TxtProduct txtProduct = logfactory.GetTxtProduct(); 
  10.         dataProduct.WriteToDatabaseLog(); 
  11.         txtProduct.WriteLogToTxt(); 
  12.         Console.WriteLine("---------------------------------------------------------"); 
  13.         Console.WriteLine("在生产环境使用日志类记录日志到数据库和txt文件"); 
  14.         logfactory = new ProductionLogFactory(); 
  15.         dataProduct = logfactory.GetDataBaseProduct(); 
  16.         txtProduct = logfactory.GetTxtProduct(); 
  17.         dataProduct.WriteToDatabaseLog(); 
  18.         txtProduct.WriteLogToTxt(); 
  19.  
  20.         Console.ReadLine(); 
  21.     } 
  22.  
  23. #endregion 

         如需源码请点击 AbstractFactoryPattern.rar 下载。


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826999


上一篇:input事件--->按键事件的基本实现


下一篇:基本时间单位 | 带你读《5G 空口设计与实践进阶 》之十五