本文作者:小黑黑

[设计模式]创建型模式之工厂方法模式

小黑黑 1年前 ( 2019-02-13 ) 1090 抢沙发
[设计模式]创建型模式之工厂方法模式摘要: 一、引言      再简单工厂模式中讲到简单工厂的缺点,简单工厂模式难以扩展,一旦添加了新的产品就不得不修改简单工厂方法...

一、引言

      再简单工厂模式中讲到简单工厂的缺点,简单工厂模式难以扩展,一旦添加了新的产品就不得不修改简单工厂方法,这就会使得简单工厂方法的实现逻辑过于复杂,并未违背了单一职责原则,而工厂方法模式可以解决简单工厂模式中存在的问题。

二、动机

        现在对上一篇讲到的系统进行修改,不在设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们定义一个抽象的按钮工厂类,在定义具体的工厂类来生成按钮,他们实现在抽象按钮工厂类中方法,这种抽象化的结果使这种结构可以再不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合“开闭原则”。

三、结构图

QX)O$%33Y9W3F~0F4(I]~J7.png

四、工厂方法模式的实现

      工厂方法模式之所以能够解决简单工厂的模式,是因为它的实现把具体产品的实现放到独立的工厂中,这样工厂方法模式就可以在新添加产品时不再去修改工厂类的逻辑,只需要实现自己的工厂类即可,这样也克服了简单工厂模式的缺点,具体实现如下:

        首先还是手机类的接口,所有的手机类都继承自此接口:

    public interface IPhone
    {
        void Call();
    }

        然后分别是小米手机和华为手机类

    public class XiaoMi : IPhone
    {
        public void Call()
        {
            Console.WriteLine("我是小米手机");
        }
    }
    public class HuaWei : IPhone
    {
        public void Call()
        {
            Console.WriteLine("我是华为手机");
        }
    }

        然后我们需要做的就是为小米手机和华为手机提供各自的工厂去创建相对应的实例:

    public interface IFactory
    {
        IPhone CreatePhone();
    }
    
    public class XiaoMiFactory : IFactory
    {
        public IPhone CreatePhone()
        {
            return new XiaoMi();
        }
    }
    
    public class HuaWeiFactory : IFactory
    {
        public IPhone CreatePhone()
        {
            return new HuaWei();
        }
    }

        我们在上端调用时就可以直接使用相对应的工厂类去获得相应的实例

    class Program
    {
        static void Main(string[] args)
        {

            IFactory xiaoMiFactory = new XiaoMiFactory();
            IPhone xiaoMi = xiaoMiFactory.CreatePhone();
            xiaoMi.Call();

            IFactory huaWeiFactory = new HuaWeiFactory();
            IPhone huaWei = huaWeiFactory.CreatePhone();
            huaWei.Call();

            Console.Read();
        }
    }

        这样我们在上端调用时并没有依赖具体的手机类,也就达到了解除耦合的作用,但我们可以发现,这比直接使用new对象的方式以及简单工厂模式更加复杂,首先代码量增多,没新来一个产品,我们都要去实现自己的业务,然后还要创建自己的工厂。

        使用工厂方法模式实现的系统,如果系统需要添加新产品,我们就可以利用多态性去实现系统的扩展,对于其他的工厂中的代码不需要任何改动,比如:如果我们要添加一个vivo手机,只需要实现vivo手机类以及vivo手机工厂就可以了,而不用像简单工厂模式中去修改工厂中的实现。

    public class Vivo : IPhone
    {
        public void Call()
        {
            Console.WriteLine("我是Vivo手机");
        }
    }
    public class VivoFactory : IFactory
    {
        public IPhone CreatePhone()
        {
            return new Vivo();
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {

            IFactory xiaoMiFactory = new XiaoMiFactory();
            IPhone xiaoMi = xiaoMiFactory.CreatePhone();
            xiaoMi.Call();

            IFactory huaWeiFactory = new HuaWeiFactory();
            IPhone huaWei = huaWeiFactory.CreatePhone();
            huaWei.Call();

            IFactory vivoFactory = new VivoFactory();
            IPhone vivo = vivoFactory.CreatePhone();
            vivo.Call();

            Console.Read();
        }
    }

五、总结

       工厂方法模式通过面向对象中的多态性来将对象的创建延迟到具体的工厂中,从而解决了简单工厂的缺点,也很好的符合了开闭原则(对扩展开放,对修改封闭)。

分享到: 网站分享代码

发表评论

快捷回复:

评论列表 (暂无评论,1090人围观)参与讨论

还没有评论,来说两句吧...