使用简单工厂模式来进行Python的设计模式编程
计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。 下面是一个简单的工厂实例: def create_animal(name): if name == 'dog': return Dog() elif name == 'cat': return Cat() animal = create_animal('dog') animal.eat('some food') create_animal就是一个工厂,各种动物就是产品,该工厂根据name来决定产出什么动物产品。产品应该具有一个基本特性,同一个工厂出产的所有产品都是一个系列,都具有相同的功能,比如动物都吃食物。 简单工厂模式的好处是可以将产品对象的细节封装在其实现类的内部,改变一个产品对象具体实现不会影响其他产品。可扩展性强,当需要新增产品类型时,只需要添加对应的实现类,然后修改工厂,增加一个判断分支即可。修改工厂函数带来的风险比较低。 另外一个比较典型的适合简单工厂模式的例子是计算器,计算器需要支持各种计算操作,比如加、减、乘、除、平方、立方、平方根、阶乘等等。那么这里的工厂就是要创建各种操作算法对象,每种操作算法对象都支持一个求值方法。 def create_operator(op): if op == '+': return AddOperation() elif op == '-': return SubOperation() elif op == '*': return MulOperation() elif op == '/': return DivOperation() op = create_operator('+') op.Calc(1,2) 前面提到,每个工厂生产的产品都是一个系列的,因此产品类通常会从同一个抽象基类派生,但不是必须的。
缺点: 使用场景:
#encoding=utf-8 # #by panda #简单工厂模式 class OperateBase(): result = 0; def GetResult(self): return self.result; class OperationAdd(OperateBase): def __init__(self,NumA,NumB): self.result = NumA + NumB; def GetResult(self): return self.result; class OperationSub(OperateBase): def __init__(self,NumB): self.result = NumA - NumB; def GetResult(self): return self.result; class OperationMult(OperateBase): def __init__(self,NumB): self.result = NumA * NumB; def GetResult(self): return self.result; class OperationDiv(OperateBase): def __init__(self,NumB): self.result = NumA / NumB; def GetResult(self): return self.result; class OperationFactory(): @staticmethod def createOperate(operate,NumB): optList = { '+':OperationAdd,'-':OperationSub,'*':OperationMult,'/':OperationDiv,} oper = OperateBase() if(optList.has_key(operate)): oper = optList[operate](NumA,NumB); return oper def clientUI(): opt = raw_input("please input a operation(+-*/): "); NumA = raw_input("please input the first number: "); NumB = raw_input("please input the second number: "); oper = OperationFactory.createOperate(opt,float(NumA),float(NumB)) print "Restlt: ",oper.GetResult() return if __name__ == '__main__': clientUI(); UML类图如下: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |