一、引言
在简单中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新对象就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的。
部分内容选自https://www.cnblogs.com/zhili/p/SingletonPatterm.html,感觉写得很好,我只是自己总结成自己的东西。
二、介绍
工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。
1. 定义各路英雄的展示方式和简单工厂一样
public interface IRace { /// <summary> /// show出王者 /// </summary> void ShowKing(); }
2. 然后实现接口的具体实现方法也一样
public class NE : IRace { public void ShowKing() { Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Moon"); } }
public class ORC : IRace { public void ShowKing() { Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Army"); } }
3. 现在重点来了,对于简单工厂来说,就相当于了一个大工厂,创建各式各样的对象,去生产各式各样的东西,随着对象越来越多,工厂不断扩增,就会显得臃肿,这时就需要将各个生产对象拆分了,即工厂模式。工厂模式就是工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口。接下来就是创建工厂类接口:
public interface IFactory { IRace CreateRace(); }
4.具体工厂类实现接口工厂的方法
public class NEFactory : IFactory { public IRace CreateRace() { return new NE(); } } public class ORCFactory : IFactory { public IRace CreateRace() { return new ORC(); } }
5. 主函数调用工厂类实现
class Program { static void Main(string[] args) { //开始实例化工厂 IFactory factory = new NEFactory(); //开始实例化英雄对象 IRace race = factory.CreateRace(); //实现英雄展示方式 race.ShowKing(); IFactory armyFactory = new ORCFactory(); IRace armyRace = armyFactory.CreateRace(); armyRace.ShowKing(); } }
三、总结
工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。