# -*- coding: gbk -*-
# -*- coding: utf-8 -*-
"""
这是简单工厂模式和单例模式的一个应用场景(参考了《大话设计模式》)。
高质量程序:
简洁、可维护、可扩展、可复用。
此处使用简单工厂模式实现一个计算器,在需要修改具体运算类时只需修改相应的那个类,故具
备可维护性;当需要增加新运算方法时只需要添加新的运算类,故具备可扩展性;实现好的具体
运算类可被其他程序复用,故具备可复用性。
"""
from abc import ABCMeta, abstractmethod
#抽象运算类
class Operation(object):
__metaclass__ = ABCMeta
def __init__(self,numA=None, numB=None):
self.numberA = numA
self.numberB = numB
@abstractmethod
def getResult(self):
pass
#具体运算类,实现具体的运算方法
class AddOperation(Operation):
def getResult(self):
return (self.numberA + self.numberB)
class MulOperation(Operation):
def getResult(self):
return (self.numberA * self.numberB)
#运算工厂类,根据输入的符号产生相应的运算类实例
#此类还使用了单例模式,因为有一个工厂就够了
class OperationFactory(object):
dic = {'+':AddOperation(), '*':MulOperation()}
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(OperationFactory, cls).__new__(
cls, *args, **kwargs)
return cls._instance
def CreateOperation(cls, operator):
return cls.dic[operator]
#Client
if __name__ == '__main__':
operF1 = OperationFactory()
# 下面两行代码用于检验是否实现了单例模式
# operF2 = OperationFactory()
# assert(id(operF1)==id(operF2))
operator = raw_input('请输入运算符号\n')
opr = operF1.CreateOperation(operator)
opr.numberA = input('请输入第一个运算数\n')
opr.numberB = input('请输入第二个运算数\n')
result = opr.getResult()
print result
设计模式之简单工厂模式与单例模式
最新推荐文章于 2023-06-20 00:02:16 发布