设计模式解读之 简单工厂模式&工厂方法模式&抽象工厂模式(2)

   上一篇写了简单的工厂模式的实现,但是他还是有一个弊端,就是实体类通过继承,在子类中实现具体的功能,这样很好的做到了功能的可扩展,但是工厂类却是在类中通过switch来判断,对不同功能类的实例化是写死在工程类中的,这样一旦需要宽展就会修改该类。现在看下面的解决方案。

   interface Animal
    {
       void Operate();
    }
    class Leg : Animal
    {
        public void Operate()
        {
            Console.WriteLine("i am a leg i can run");
        }
    }
    class Mouse : Animal
    {
        public  void Operate()
        {
            Console.WriteLine("i am a mouse i can eat");
        }
    }

    interface Factory
    {
        Animal CreateAnimal();       
    }
    class FactoryLeg : Factory
    {
       public  Animal CreateAnimal()
        {
            return new Leg();
        }
    }

    class FactoryMouse : Factory
    {
       public Animal CreateAnimal()
        {
            return new Mouse();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Factory factory = new FactoryLeg();
            Animal animal = factory.CreateAnimal();
            animal.Operate();
            Console.ReadKey();
        }
    }
这样就充分解决了上面提到的问题了,但是与此同时也有个相对于简单工厂模式的缺点,就是无法自动的选择去实例化那个功能类,这一点之前是在工厂类中的switch中做到的,看见这个设计模式也并非是完美的。




当然有一种方法可以在这个工厂方法模式中,根据具体的需要自动判断需要实例化的功能类,那就是反射
在客户端调用的
现在把上面的
Factory factory = new FactoryLeg();
替换成这一条代码Factory factory = (Factory)Assembly.Load("FactoryPattern").CreateInstance("FactoryPattern.FactoryLeg");
其效果是一样一样的,但是大家看得出来这条代码是用字符串来指定的,这样就可以很轻松的将用户输入的字符串组合成参数从而来指定要实例化的功能类了,是不是很强大啊。



   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值