• C# 设计模式-工厂方法模式


    一.介绍  

      工厂方法模式(Factory Method Pattern)。属于创建型模式。定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

    二.场景

      比如我们去水果店买水果,我们只要说出要买什么水果,水果店就会给我们什么水果。这里的水果店相当于一个工厂接口,水果店下不同的水果有不同售货员,售货员就是这工厂接口的具体实现。我们买水果,就找到对应水果的售货员,然后售货员去new一个水果类。

    三.实现

      定义父类接口IFruit(水果)。

    public interface IFruit
    {
        public string Name { get; set; }
    }

      子类继承水果接口。

    public class Apple : IFruit
    {
        public string Name { get; set; } = "苹果";
    }
    
    public class Orange : IFruit
    {
        public string Name { get; set; } = "";
    }

      定义工厂接口IFactory。

    public interface IFactory
    {
        IFruit CreateFruit();
    }

      对应工厂的实现,不同的工厂类负责实例化不同的水果类。

    public class AppleFactory : IFactory
    {
        public IFruit CreateFruit()
        {
            return new Apple();
        }
    }
    
    public class OrangeFactory : IFactory
    {
        public IFruit CreateFruit()
        {
            return new Orange();
        }
    }

      调用工厂类方法去实例化水果类。

    public static void Main(string[] args)
    {
        IFactory factory = new AppleFactory();
        IFruit fruit = factory.CreateFruit();
        Console.WriteLine(fruit.Name);
    }

      在工厂方法模式中,如果想要新增一种新的水果,只需要新增水果类和对应工厂类,原有的工厂代码不需要进行修改,而不像在简单工厂模式中要修改工厂类的代码。比如新增水果香蕉。

    public class Banana : IFruit
    {
        public string Name { get; set; } = "香蕉";
    }
    
    public class BananaFactory : IFactory
    {
        public IFruit CreateFruit()
        {
            return new Banana();
        }
    }
    
    public static void Main(string[] args)
    {
        IFactory factory = new BananaFactory();
        IFruit fruit = factory.CreateFruit();
        Console.WriteLine(fruit.Name);
    }

    四.总结

      工厂方法模式把具体实例化的过程延伸到具体的工厂类中,解决了简单工厂模式中要新增水果类就得改工厂类代码的缺点,符合了开闭原则(对拓展开放,对修改封闭)。

      缺点是每新增一个水果类,就得新增一个对应的工厂类,增加代码量。

      

  • 相关阅读:
    快手记录的面试题2
    快手Java实习一二面经(记录的面试题1)
    219. 存在重复元素 II(面试题也考过)
    117. 填充每个节点的下一个右侧节点指针 II(没想到,但是其实蛮简单的)
    116. 填充每个节点的下一个右侧节点指针
    最后来几个快手的面试题吧,先记录下来大概看看
    快手Java实习一二面面经(转载)
    双亲委派模型
    聚集索引与非聚集索引总结(转载)
    136. 只出现一次的数字
  • 原文地址:https://www.cnblogs.com/shadoll/p/14234882.html
Copyright © 2020-2023  润新知