天天看点

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

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