传统的简单工厂模式缺点是:
缺点:由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;
,这样一来,但产品的种类增加的时候,即有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,
这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。而且更重要的是,简单工厂模式违背了“开放封闭原则”,
就是违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。
具体代码,
<pre name="code" class="csharp">namespace NewFeatureStudy
{
public interface IFruit
{ }
public class Orange : IFruit
{
public Orange()
{
Console.WriteLine("Orange");
}
}
public class Apple : IFruit
{
public Apple()
{
Console.WriteLine("Apple");
}
}
public class FruitFactory2//不用反射的工厂类
{
private static FruitFactory2 _instance = new FruitFactory2();
public static FruitFactory2 Instance
{
get { return _instance; }
}
public IFruit Create(string name)
{
switch (name)
{
case "Apple":
return new Apple();
case "Orange":
return new Orange();
default:
throw new Exception("水果名错误");
}
}
}
public class FruitFactory//反射的工厂类
{
private static FruitFactory _instance = new FruitFactory();
public static FruitFactory Instance
{
get { return _instance; }
}
public IFruit MakeFruit(string Name)
{
IFruit MyFruit = null;
try
{
Type type = Type.GetType(Name, true);
MyFruit = (IFruit)Activator.CreateInstance(type);
}
catch (TypeLoadException e)
{
Console.WriteLine("I dont know this kind of fruit,exception caught - {0}", e.Message);
}
return MyFruit;
}
}
class Program
{
static void Main(string[] args)
{
string FruitName = Console.ReadLine();
// FruitFactory.Instance.MakeFruit("NewFeatureStudy."+FruitName);//利用反射
FruitFactory2.Instance.Create( FruitName);//不用反射
Console.ReadKey();
}
}
}
利用反射可以克服那些逻辑判断