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);
}

四.总结

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

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

  

 

posted @ 2021-01-06 10:54  shine声  阅读(333)  评论(0编辑  收藏  举报