简单的 反射工厂模式

namespace ReflectionFactoryTest
{
   public interface IFruit
    {
       void Product();
    }

 

public class Apples:IFruit
    {
        #region IFruit 成员

        public void Product()
        {
            Console.WriteLine("Apples.....................");
        }

        #endregion
    }

 

public class Banana:IFruit
    {

        #region IFruit 成员

        public void Product()
        {
            Console.WriteLine("Banana.....................");
        }

        #endregion
    }

 

/// <summary>
    /// 反射工厂
    /// 反射工厂的好处是,无论我们再添加几个类,都不用修改这个工厂的方法
    /// </summary>
    public class ReflectionFactoryTest
    {
        /// <summary>
        /// 工厂的方法
        /// </summary>
        /// <param name="className"></param>
        /// <returns></returns>
        public static  IFruit CreateFruit(string className)
        {
            //加载程序集,Load()方法的参数是命名空间名,要注意大小写
            Assembly assembly = Assembly.Load("ReflectionFactoryTest");
            //通过调用CreateInstance()来生成反射的实例,参数为命名空间名.类名,返回值是object,要强制转换成相应的接口类型
            IFruit ifruit = assembly.CreateInstance(string.Format("ReflectionFactoryTest.{0}",className)) as IFruit;
            return ifruit;
        }

       
    }

 

 public class Program
    {
        static void Main(string[] args)
        {
          
            IFruit ifruit = ReflectionFactoryTest.CreateFruit("Apples");
           ifruit.Product();

        }
    }
}

 

1. .net中的智能引擎 和 petshop就是用得反射工厂

2. 可以用抽象类/接口

     接口可以多重继承,但是抽象类不可以;  接口为了实现系统中的松偶合.

     抽象类与子类,是父子关系; 而接口则不是,是松偶合的关系.

     抽象类能够定义方法的实现;  接口不能包含方法的实现。

     抽象类和内部方法必须abstract 声明 而且 子类中必须override 才能覆盖

3.3种工厂模式的区别

     简单工厂模式

     一个抽象产品类,可以派生出多个具体产品类。 
     一个具体工厂类。 

     工厂方法模式: 
     一个抽象产品类,可以派生出多个具体产品类。 
     一个抽象工厂类,可以派生出多个具体工厂类。 
     每个具体工厂类只能创建一个具体产品类的实例。 

     抽象工厂模式: 
     多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
     一个抽象工厂类,可以派生出多个具体工厂类。 
     每个具体工厂类可以创建多个具体产品类的实例。

4. 如果是文件所在的命名空间

可以使用 Type type = Type.GetType("ReflectionFactoryTest.Apples", true);
       MyFruit = (IFruit)Activator.CreateInstance(type);

你可能感兴趣的:(工厂模式)