zoukankan      html  css  js  c++  java
  • 极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)

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

  • 相关阅读:
    浅析 KMP
    【GOJ 3049】玩具
    较详细的gdb入门教程
    【GOJ 2963】记者
    【GOJ 2961】数数
    GF OIer's Talk 维护笔记
    Linux 中 UFW 的使用
    开源是什么?能吃吗?
    个人介绍
    NOIP2020 爆零记
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/2193906.html
Copyright © 2011-2022 走看看