天天看點

極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)

五個角色:抽象産品角色(AbstractProduct)、具體産品角色(Product)、抽象工廠角色(AbstractFactory)、具體工廠角色(ConcreteFactory)、用戶端(Client) 

         抽象産品角色(AbstractProduct):聲明産品接口

         具體産品角色(Product):實作産品的接口

         抽象工廠角色(AbstractFactory):聲明生成對應抽象産品的方法

         具體工廠角色(ConcreteFactory):實作生成抽象産品方法,生成産品

         用戶端(Client):執行生産并運作産品

實作思路:用戶端調用具體的工廠角色調用具體的産品角色。

類圖:

極速了解設計模式系列:4.抽象工廠模式(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):

極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)
#region 抽象産品角色

    //插入資料庫的抽象産品角色
    abstract class DataBaseProduct
    {
        public abstract void WriteToDatabaseLog();
    }
    
    //寫入Txt檔案的抽象産品角色
    abstract class TxtProduct
    {
        public abstract void WriteLogToTxt();
    }

    #endregion
           
極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)

        二、具體産品角色(Product):

極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)
#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
           
極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)

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

極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)
#region 抽象工廠角色
    //日志工廠
    abstract class LogFactory
    {
        public abstract DataBaseProduct GetDataBaseProduct();

        public abstract TxtProduct GetTxtProduct();
    }

    #endregion
           
極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)

        四、具體工廠角色(ConcreteFactory):

極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)
#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
           
極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)

        五、用戶端(Client):

極速了解設計模式系列:4.抽象工廠模式(Abstract Factory Pattern)
#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