ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 抽象工厂模式(C#)

抽象工厂模式(C#)

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-01-20 17:01:24 0 删除 编辑

不理解抽象工厂模式是无法彻底明白 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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5348094