天天看點

Net設計模式執行個體之抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式(Abstract Factory Pattern),提供一個建立一系列相關或者互相依賴對象的接口,而無需制定他們的具體類。優點是:易于交換産品系列,由于具體工廠類在一個應該用中隻需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠類變得非常容易,它隻需要改變具體工廠即可使用不同的産品配置。抽象工廠的另一個優點是,它讓具體的建立執行個體與用戶端分離,用戶端是通過他們的抽象接口操縱執行個體,産品的具體類名也被具體工廠的實作分離,不會出現在客戶的代碼中。

       常用用于解決資料通路程式,也就是說程式通過使用抽象工廠模式後,可以靈活地在不同的資料庫之間切換,而不需要費時費力地改變原有程式。

Net設計模式執行個體之抽象工廠模式(Abstract Factory Pattern)

IProductA、IProductA接口:兩個産品接口,他們都有可能有兩種不同的實作。

ProductA1、ProductA2,ProductB1、ProductB2具體實作類:對兩個産品接口的具體分類的實作。

AbstractFactory抽象類:抽象工廠接口,它裡面應該包含所有産品建立的抽象方法。

ConcreteFactory1、ConcreteFactory2具體工廠類:建立具有特定實作的産品對象

1、産品接口IProductA、IProductB及其兩種實作

public interface IProductA

{

    void Show();

}

public class ProductA1 : IProductA

    public void Show()

    {

        Console.WriteLine("具體産品類{0}展示方法。",this.GetType().Name);

    }

public class ProductA2 : IProductA

        Console.WriteLine("具體産品類{0}展示方法。", this.GetType().Name);

public interface IProductB

    void Insert();

public class ProductB1 : IProductB

    public void Insert()

        Console.WriteLine("具體産品類{0}插入方法。", this.GetType().Name);

public class ProductB2 : IProductB

2、抽象工廠接口AbstractFactory,及其具體的工廠AbstractFactory1、AbstractFactory2

public abstract class AbstractFactory

    public abstract IProductA CreateProductA();

    public abstract IProductB CreateProductB();

public class AbstractFactory1:AbstractFactory

    public override IProductA CreateProductA()

        IProductA productA1 = new ProductA1();

        return productA1;

    public override IProductB CreateProductB()

        IProductB productB1 = new ProductB1();

        return productB1;

public class AbstractFactory2 : AbstractFactory

        IProductA productA2 = new ProductA2();

        return productA2;

        IProductB productB2 = new ProductB2();

        return productB2;

3、用戶端代碼

static void Main(string[] args)

    //根據需求調用具體工廠AbstractFactory1

    AbstractFactory factory1 = new AbstractFactory1();

    IProductA productA1 = factory1.CreateProductA();

    IProductB productB1 = factory1.CreateProductB();

    productA1.Show();

    productB1.Insert();

    Console.WriteLine("\n");

    //根據需求調用具體工廠AbstractFactory2

    AbstractFactory factory2 = new AbstractFactory2();

    IProductA productA2 = factory2.CreateProductA();

    IProductB productB2 = factory2.CreateProductB();

    productA2.Show();

    productB2.Insert();

    Console.ReadKey();

Net設計模式執行個體之抽象工廠模式(Abstract Factory Pattern)

使用抽象工廠+反射+配置檔案實作資料通路層程式。結構如下圖所示

Net設計模式執行個體之抽象工廠模式(Abstract Factory Pattern)

用反射+抽象工廠+配置檔案的資料通路程式。

Assembly.Load("程式集名稱").CreateInstance("命名空間.類名稱")。比如:

IProduct product=(IProduct)Assembly.Load("抽象工程模式").CreateInstance("抽象工程模式.SqlServerProduct")。

常用做法是:

Private static readonly string AssemblyName="抽象工程模式";

Private static readonly string DB=ConfiurationManager.AppSettings["db"];

配置檔案如下:

<configuration>

    <appSettings>

         <add key="db" value="Sqlserver"/>

通過讀配置檔案給DB字元指派,在配置檔案中寫明目前使用的是SqlServer 還是Access資料庫。反射+抽象工廠+配置檔案解決方案解決了資料通路時的可維護、可擴充問題

1、對象Uer、Product及其相對應的操作

public interface IUser

public class SqlServerUser:IUser

        Console.WriteLine("{0}插入使用者.",this.GetType().Name);

public class AccessUser : IUser

        Console.WriteLine("{0}插入使用者.", this.GetType().Name);

public interface IProduct

    void GetProduct();

public class SqlServerProduct : IProduct

    public void GetProduct()

        Console.WriteLine("{0}查詢商品.", this.GetType().Name);

public class AccessProduct : IProduct

2、資料通路類DataAccess

public class DataAccess

    private static readonly string AssemblyName = "AbstractFactoryReflection";

    private static readonly string db = "SqlServer";

    public static IUser CreateUser()

        string className = AssemblyName + "." + db + "User";

        IUser user = (IUser)Assembly.Load(AssemblyName).CreateInstance(className);

        return user;

    public static IProduct CreateProduct()

        string className = AssemblyName + "." + db + "Product";

        return (IProduct)Assembly.Load(AssemblyName).CreateInstance(className);

    IUser user = DataAccess.CreateUser();

    user.Insert();

    IProduct product = DataAccess.CreateProduct();

    product.GetProduct();

抽象工廠模式(Abstract Factory Pattern),提供一個建立一系列相關或者互相依賴對象的接口,而無需制定他們的具體類。抽象工廠模式的典型應用就是,使用抽象工廠+反射+配置檔案實作資料通路層程式。

版權

作者:靈動生活 郝憲玮

如果你認為此文章有用,請點選底端的【推薦】讓其他人也了解此文章,

Net設計模式執行個體之抽象工廠模式(Abstract Factory Pattern)

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。