抽象工廠模式(C#)

iDotNetSpace發表於2009-01-20

不理解抽象工廠模式是無法徹底明白 Petshop 的,聽起來好像名詞比較多,不好理解...其實就像一層窗戶紙一樣!

有兩點需要注意一下:
1. 必須明白介面的概念及使用方法
2. IFruit MyFruit = (IFruit)Assembly.Load(path).CreateInstance(sTypeName);
    這一句包含的內容比較多,但是理解了其實也沒什麼的;
    首先是使用介面宣告物件,Assembly 是反射方式載入物件,path 為應用程式的“程式集名稱”,sTypeName 為完整的類名
    比方說下面的程式碼中,程式集的名稱在專案屬性中指定(我這裡使用的和名稱空間名稱一樣),而完整類名就更好理解了!

使用方法:

Code
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label lb = new Label();
        string FruitName = TextBox1.Text.Trim();
        this.form1.Controls.Add(lb);

        //宣告工廠物件
        FruitFactory MyFruitFactory = new FruitFactory();

        //以介面方式宣告物件(可以例項化為此介面的任何一個物件)
        IFruit MyFruit = MyFruitFactory.MakeFruit(FruitName);

        //呼叫物件內的方法
        lb.Text = MyFruit.PostName();
    }
 

工廠定義如下:

Code
using System.Reflection;

namespace vopt.DAL
{
    ///


    /// 抽象介面定義
    ///

    public interface IFruit
    {
        string PostName();//返回類名
    }

    ///


    /// 例項型別一
    ///

    public class Orange : IFruit
    {
        public string PostName()
        {
            return this.ToString();//返回類名
        }
    }

    ///


    /// 例項型別二
    ///

    public class Apple : IFruit
    {
        public string PostName()
        {
            return this.ToString();//返回類名
        }

    }

    ///


    /// 抽象工廠定義
    ///

    public class FruitFactory
    {
        public IFruit MakeFruit(string className)
        {
            //程式集名稱
            string path = "vopt.DAL";

            //完整的類名,vopt.DAL.Apple/Orange
            string sTypeName = path + "." + className;

            //利用反射載入物件
            IFruit MyFruit = (IFruit)Assembly.Load(path).CreateInstance(sTypeName);

            return MyFruit;
        }
    }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-541540/,如需轉載,請註明出處,否則將追究法律責任。

相關文章