一.介绍
工厂方法模式(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); }
四.总结
工厂方法模式把具体实例化的过程延伸到具体的工厂类中,解决了简单工厂模式中要新增水果类就得改工厂类代码的缺点,符合了开闭原则(对拓展开放,对修改封闭)。
缺点是每新增一个水果类,就得新增一个对应的工厂类,增加代码量。