简单工厂模式:Static Factory Method,又称静态工厂模式,属于创建型模式,不属于GOF的二十三种设计模式。由一个工厂对象根据传入的参数来决定最后生成的对象类型。在工厂模式的大家族中属于最简单的一种模式。
问题描述如下:已知某工资系统根据职工工种的类型来计算工资信息。公司职工有业务员、程序员、经理。
如果我们根据输入的值来自动计算工资的话,代码如下。
这里我们使用C++来描述,其他语言类似,这里只描述关键部分。
如果这样来描述的话,那么很快这道题就可以做出来,而且也是正确的。但如果到了实际开发过程中,客户要求在现有的经理工资计算时将其所管理的部门的总营业额中取5%作为员工奖金发放。这个时候我们就会发现原有系统就已经需要重新描述,代码的复用性为0。
接下来使用面向对象的思想来解决这个问题,下附类图:
这样我们只需要在经理的相关方法中重写即可,其他部分不需要改动。这里我们达到了第一层,面向对象。这样如果需要加入新的职工类型如前台等工种时,我们只需要继承worker类然后重写关键代码即可,这样系统的可维护性就大大提高了。
代码如下:
这样我们在扩展这个系统的时候只需要在判断的时候使用我们新增加的类型进行判断即可。但是还存在一个大问题就是如果每一个都需要这样进行修改也比较麻烦,而且容易产生问题。所以我们将创建对象这一过程独立出来,使用另外一个类——工厂类来生成我们需要的对象。类图如下:
这个时候我们将创建对象的过程放入工厂类,需要扩展时只需要将新的类型加入工厂即可,其余部分不需要改动,这样可维护性也大大提高了。
简述优与劣:
优点:外部在使用的时候只需要告诉工厂需要什么产品即可,不需要关心细节,只用维护其他逻辑即可。有利于整体软件体系结构的优化。
缺点:将所有的创建实例的功能都放置在同一个工厂中,违反了软件开发的高内聚的原则。且工厂能够创建的仅为提前已知的产品,如果需要添加新的产品就需要重写工厂类。当产品数量过多时,整个模块将交错在一起,加大了维护和扩展的不便。
推荐的使用场景:需要创建的产品较少时,用户只知道需要的产品类型,不明确其他具体创建过程或不需要了解时使用。代码高度内聚,仅推荐在小型系统中使用。