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);