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

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

五个角色:抽象产品角色(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):

 

 
  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


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
6月前
|
设计模式 Java
设计模式6 - 抽象工厂模式【Abstract Factory Pattern】
设计模式6 - 抽象工厂模式【Abstract Factory Pattern】
20 0
|
6月前
|
设计模式
设计模式5 - 工厂方法模式【Factory Method Pattern】
设计模式5 - 工厂方法模式【Factory Method Pattern】
20 0
|
8月前
|
设计模式
【3W2H设计模式】抽象工厂模式(Abstract Factory Pattern)
【3W2H设计模式】抽象工厂模式(Abstract Factory Pattern)
105 0
|
8月前
|
设计模式 数据库 uml
3W2H学设计模式- 工厂模式(Factory Pattern)
3W2H学设计模式- 工厂模式(Factory Pattern)
90 0
|
11月前
|
设计模式 XML Java
Java设计模式-工厂模式(FactoryPattern)
Java设计模式-工厂模式(FactoryPattern)
|
设计模式
《一天一个设计模式》----抽象工厂模式(Abstract Factory)
《一天一个设计模式》----抽象工厂模式(Abstract Factory)
101 0
《一天一个设计模式》----抽象工厂模式(Abstract Factory)
|
设计模式
【愚公系列】2021年12月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)
【愚公系列】2021年12月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)
【愚公系列】2021年12月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)
|
设计模式 数据库
【愚公系列】2021年12月 二十三种设计模式(一)-工厂方法模式(Factory Method Pattern)
【愚公系列】2021年12月 二十三种设计模式(一)-工厂方法模式(Factory Method Pattern)
【愚公系列】2021年12月 二十三种设计模式(一)-工厂方法模式(Factory Method Pattern)
|
Windows 设计模式
设计模式四: 抽象工厂(Abstract Factory)
简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象工厂即是对产品族的抽象.
1843 0
|
关系型数据库 Go C#
C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
原文:C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】 一、引言       在上一篇文章中我们讲解了过渡的一种模式叫做【简单工厂】,也有叫【静态工厂】的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化越多,里面的If--Else--也越多,这样就会造成简单工厂的实现逻辑过于复杂。
1541 0