反射实现简单工厂模式

传统的简单工厂模式缺点是:
缺点:由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;
,这样一来,但产品的种类增加的时候,即有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,
这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。而且更重要的是,简单工厂模式违背了“开放封闭原则”,
就是违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。

具体代码,
<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();
        }
    }
}
    



利用反射可以克服那些逻辑判断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值