1. 问题
大家是否还记得第一章节的鸭子🦆。现在,我们的代码在某个地方需要初始化这些🦆,很多初学者可能会这么来实现的:
Duck duck;if (panic) {duck = new MallardDuck();} else if (hunting) {duck = new DeckoyDuck();} else {duck = new RubberDuck();}
**
现在,我们要新加入一种类型的🦆,火箭(rocket)鸭子。
对于上面那段代码来说,我们可能需要修改相关初始化鸭子的代码,而这种方式将会造成系统的更难维护和更新,而且也更容易犯错。
还记得我们之前说过的设计原则吗?
对修改关闭
我们这段代码,并没有做到对修改关闭的原则。我们可以这么做:
将实例化具体类的代码从应用中抽离,或者封装起来,是他们不会干扰应用的其他部分。
2. 我们可以怎么做呢
把这部分代码搬到另外一个对象(factory)中,这个对象只管如何创建🦆,如果任何对象想要创建🦆,那么就找这个对象。
这个工厂(factory)对象可以设置成一个静态方法。但是也有一定的坏处,比如不能继承。
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
