设计模式之简单工厂模式【一】
1 简单工厂模式
1.1 应用环境
一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
1.2 定义
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
- 简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
- 简单工厂模式包含三个角色:工厂角色负责实现创建所有实例的内部逻辑;抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
- 简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
- 简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
- 简单工厂模式适用情况包括:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心。
2 代码实现
题目:利用面向对象语言实现一个计算机控制台程序,实现常见的加减乘除运算,得到相应的结果。—《大话设计模式》
面向对象
设计的程序要做到:
- 可维护:代码一处更改,不能产生连锁反应,不能影响其他地方
- 可复用:尽量减少重复性代码
- 可扩展:如果需要扩展新的功能、新的业务,则只需要增加新的类就好,不对已有的类和逻辑产生影响
- 灵活性好
面向对象的三大特性:封装、继承和多态。在后期软件开发或者编写代码的时候,需要考虑通过封装、继承、多态把程序的耦合性降低,需要结合设计模式,使得程序更加灵活、容易修改,并且易于复用。在后期的程序开发中,需要考虑把业务逻辑与界面逻辑分开,让它们之间的耦合度下降,才能达到容易维护和拓展。
类的结构图
如上图的类结构图可知,首先需要定义一个父类运算类,这个类主要接受一些用户输入的参数,不做具体的运算,相应的代码如下:
代码:Operation类
class Operation(object):
def __init__():
self._numberA=0
self._numberB=0
@property
def numberA(self):
return self._numberA
@property
def numberB(self):
return self._numberB
@numberA.setter
def numberA(self,value):
self._numberA=value
@numberB.setter
def numberB(self,value):
self._numberB=value
def GetResult(self):
result =0
return result
接下来开始具体的运算类,都继承自Operation
父类,并且在子类中重写了getResult()
方法,从而降低了不同的业务逻辑的耦合度,修改任何一种运算类都不会影响其他的运算类,具体的类代码如下:
代码:加减乘除类
class OperationAdd(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
result=self._numberA+self._numberB
return result
class OperationSub(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
result=self._numberA-self._numberB
return result
class OperationMul(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
result=self._numberA*self._numberB
return result
class OperationDiv(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
try:
result = self._numberA/self._numberB
except Exception as e:
print("Errors:",e)
return result
接下来实例化对象,采用简单工厂模式,采用单独的一个类来做这个创造实例的过程,这就是工厂,相应的工厂类为:
代码:简单运算工厂类
#------------------简单工厂模式------------------
class OperationFactory():
def __init__(self):
pass
def createOperate(operate):
if(operate=='+'):
return OperationAdd()
elif(operate=='-'):
return OperationSub()
elif(operate=='*'):
return OperationMul()
elif(operate=='\\'):
return OperationDiv()
else:
print("Errors")
我们只需要输入运算符号,工厂就会实例化出合适的对象,通过多态,返回父类的方式实现结果的计算。相应的客户端代码测试如下:
代码:开始运算
def main():
operate="\\"
oper = OperationFactory.createOperate(operate)
oper.numberA = 15
oper.numberB = 5
print(oper.GetResult())
if __name__ == '__main__':
main()
相应的完整代码如下:
"""
简单工厂模式实现计算机基本运算:Version 1.0
"""
class Operation(object):
def __init__():
self._numberA=0
self._numberB=0
@property
def numberA(self):
return self._numberA
@property
def numberB(self):
return self._numberB
@numberA.setter
def numberA(self,value):
self._numberA=value
@numberB.setter
def numberB(self,value):
self._numberB=value
def GetResult(self):
result =0
return result
class OperationAdd(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
result=self._numberA+self._numberB
return result
class OperationSub(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
result=self._numberA-self._numberB
return result
class OperationMul(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
result=self._numberA*self._numberB
return result
class OperationDiv(Operation):
def __init__(self):
super(Operation,self).__init__()
def GetResult(self):
result =0
try:
result = self._numberA/self._numberB
except Exception as e:
print("Errors:",e)
return result
#------------------简单工厂模式------------------
class OperationFactory():
def __init__(self):
pass
def createOperate(operate):
if(operate=='+'):
return OperationAdd()
elif(operate=='-'):
return OperationSub()
elif(operate=='*'):
return OperationMul()
elif(operate=='\\'):
return OperationDiv()
else:
print("Errors")
def main():
# o = OperationAdd()
# o.numberA = 15
# o.numberB = 50
# print(o.GetResult())
operate="\\"
oper = OperationFactory.createOperate(operate)
oper.numberA = 15
oper.numberB = 5
print(oper.GetResult())
if __name__ == '__main__':
main()