zoukankan      html  css  js  c++  java
  • 抽象工厂模式(C#)

    不理解抽象工厂模式是无法彻底明白 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
    {
        
    /// <summary>
        
    /// 抽象接口定义
        
    /// </summary>
        public interface IFruit
        {
            
    string PostName();//返回类名
        }

        
    /// <summary>
        
    /// 实例类型一
        
    /// </summary>
        public class Orange : IFruit
        {
            
    public string PostName()
            {
                
    return this.ToString();//返回类名
            }
        }

        
    /// <summary>
        
    /// 实例类型二
        
    /// </summary>
        public class Apple : IFruit
        {
            
    public string PostName()
            {
                
    return this.ToString();//返回类名
            }

        }

        
    /// <summary>
        
    /// 抽象工厂定义
        
    /// </summary>
        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;
            }
        }
    }

  • 相关阅读:
    关于CoreData的使用
    【转】向iOS开发者介绍C++(-)
    Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
    【转】Object-C 多线程中锁的使用-NSLock
    写了半天的返回
    oracle 锁表问题
    LINQ的基本认识
    Oracle客户端配置
    REVERSE
    vchar2和nvchar2
  • 原文地址:https://www.cnblogs.com/jarod99/p/1378935.html
Copyright © 2011-2022 走看看