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

来源:互联网 发布:java string转成Byte 编辑:程序博客网 时间:2024/06/06 13:58

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

0 0
原创粉丝点击