设计模式就是设计程序的方法,也是前人编程经验的总结。何谓简单工厂设计模式?我们都知道工厂的主要任务是生产产品的,而简单工厂指的是该工厂生产规模很小,只生产同一类型但型号不同的产品。例如:联想电脑只生产计算机,但生产出来的计算机型号可能不同。所以简单工厂设计模式就是模仿这种生产方式,工厂方法内的职责是生产子类产品,但最后都将该子产品上溯造型为父类型输出。对于调用者来讲,不需要关心工厂方法内到底是如何实现的,只需要如何调用工厂方法,得到父产品即可。
这里我们举一个生动有趣的例子来说明简单工厂设计模式为程序设计带来的好处。在《圣经》《创世纪》中讲到万物是由上帝创造而成,也就是说Cat、Dog、Frog都是由上帝创造而来,而Cat、Dog、Frog都属于Animal,于是我们便有了如下图所示的继承关系。
代码
若我们编写这样一个WinForm小程序,让用户从窗口输入希望上帝创造的动物,然后让创造出来的动物和我们打招呼。于是便有下面的窗体效果:
若不采用简单工厂设计模式,则在【创造】按钮的Click事件中可以这样写:
这样写虽然能实现我们想要的效果,但问题时在现实开发当中,程序的规模很大,参与开发的人数众多。可能窗体是由张三负责编写,而动物类是由李四负责编写,客户的需求往往千变万化,可能有一天客户需要李四再增加一个动物Pig,虽然李四按照客户的要求将Pig类创建好了,但此时可能张三正在夏威夷度假,并且窗体的源代码都在张三那里,李四给张三打电话时张三正在呼呼大睡。可想而知,这种开发方式如何能保证项目如期完成?所以我们有必要改进这种落后的开发模式,那么让我们试的采用用简单工厂设计模式来看一下是否能提高我们的开发效率。
一、简单工厂设计模式之:一般法
好了,现在让李四创建一个工厂类GodFactory,该工厂类中的CreateAnimal()方法生产动物,但不管何种动物,最终都将其返回为父类Animal类型。
那么张三的窗体中【创造】按钮的Click事件代码就改进为:
对于张三来讲他只需要知道如何调用CreateAnimal()方法得到Animal对象即可,将来不管李四再增加多少个动物子类,张三的窗体代码不需要任何改动,即使张三飞到火星,李四也不用着急。
看到了么,这就是简单工厂设计模式带来的好处。
不过现在还是有个问题,李四发现每次他增加一个动物子类都需要对GodFactor类中的CreateAnimal()方法进行改动,再增加一些判断语句,有没有更好的方法将其改进,以后不管增加多少个动物子类,都无需对CreateAnimal()方法做任何修改呢?这就是我们接下来要讲的如何用反射法来实现简单工厂设计模式。
二、 简单工厂设计模式之:反射法
反射法就是采用了反射机制,由系统根据类型对象创建实例对象,然后将该实例对象返回为其父类型的方法。由于是由系统自动创建对象,所以我们只需要判断用户输入的动物类型是否存在即可。代码改进如下:
而张三的窗体【创造】按钮的Click事件处理方法仍然保持不变。
这样一来,不管李四定义了多少个动物子类,GodFactory类中的CreateAnimal()方法无需做任何改动,是不是更简单了?
所以编程的魅力就在于不断创造出新的方法,更好的解决复杂的问题。