天天看點

極速了解設計模式系列: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