《大话设计模式》——简单工厂模式(Python版)

简单工厂模式(Simple Factory Pattern)是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.

例:

使用Python设计一个控制台计算器,要求输入两个数和运算符号,得到运算结果。

1. 初学者写法

class Operation(object):

    def __init__(self):
        pass

    def conver_strNumber(self, strNumber):
        '''
        将字符串格式的数字,转化成对应格式的数字
        :param strNumber:
        :return:
        '''
        if '.' not in strNumber:
            return int(strNumber)
        else:
            return float(strNumber)

    def op(self, strNumberA, strNumberB, strOperate):
        if strOperate == '+':
            return self.conver_strNumber(strNumberA) + self.conver_strNumber(strNumberB)
        elif strOperate == '-':
            return self.conver_strNumber(strNumberA) - self.conver_strNumber(strNumberB)
        elif strOperate == '*':
            return self.conver_strNumber(strNumberA) * self.conver_strNumber(strNumberB)
        elif strOperate == '/':
            if strNumberB != '0' and strNumberB != '0.0':
                return self.conver_strNumber(strNumberA) / self.conver_strNumber(strNumberB)
            else:
                return 0
        else:
            print('只能做加减乘除运算')

if __name__ == '__main__':
    p = Operation()
    print(p.op('2.2', '1', '+'))
    
# 输出
21.2

分析:以上这种写法,将加减乘除运算全部放在一个类中实现,虽然实现了计算器的功能,但增加其他运算或修改某个运算都必须在Operation类中进行修改。 使得程序不容易维护、扩展以及复用,并且耦合性高

2.使用简单工厂模式

# Operation运算类
class Operation(object):
    def __init__(self, strNumberA=0, strNumberB=0):
        self.NumberA = strNumberA
        self.NumberB = strNumberB

    def conver_strNumber(self, strNumber):
        '''
        将字符串格式的数字,转化成对应格式的数字
        :param strNumber:
        :return:
        '''
        if '.' not in strNumber:
            return int(strNumber)
        else:
            return float(strNumber)

    def GetResult(self):
        pass


# 加法运算类
class OperationAdd(Operation):
    def GetResult(self):
        return self.conver_strNumber(self.NumberA) + self.conver_strNumber(self.NumberB)


# 减法运算类
class OperationSub(Operation):
    def GetResult(self):
        return self.conver_strNumber(self.NumberA) - self.conver_strNumber(self.NumberB)


# 乘法运算类
class OperationMul(Operation):
    def GetResult(self):
        return self.conver_strNumber(self.NumberA) * self.conver_strNumber(self.NumberB)


# 除法运算类
class OperationDiv(Operation):
    def GetResult(self):
        if self.NumberB != 0 and self.NumberB != 0.0:
            return self.conver_strNumber(self.NumberA) / self.conver_strNumber(self.NumberB)
        else:
            return '除数不能为0'

# 其他操作符运算
class OperationUndef(Operation):
    def GetResult(self):
        return '操作符错误'


# 简单工厂类
class OperationFactory(object):
    def createOperate(self, operate):
        if operate == '+':
            return OperationAdd()
        elif operate == '-':
            return OperationSub()
        elif operate == '*':
            return OperationMul()
        elif operate == '/':
            return OperationDiv()
        else:
            return OperationUndef()

if __name__ == '__main__':

    strNumA = '1.0'
    strNumB = '2'
    oper = '/'

    OP = OperationFactory()
    oper_obj = OP.createOperate(oper)
    oper_obj.NumberA = strNumA
    oper_obj.NumberB = strNumB
    result = oper_obj.GetResult()
    print(result)
    
# 输出
0.5

分析:将各种运算拆分成单独的类,均继承于Operation类,各运算子类重写Operation类中的GetResult()方法。统一通过简单工厂类(OperationFactory类)实例化运算所需的运算子类。

这样设计的优点:

  • 易扩展

    如果添加新的运算类,只需要

    1. 新的运算类继承Operation类,并重写GetResult()方法
    2. 在简单工厂类(OperationFactory类)中添加对应的if语句

    无需对其他运算类进行操作。

  • 易维护

    对某一运算类进行修改,并不涉及其他运算类,很大程度上避免了由于误操作而对其他运算类修改的问题。

  • 低耦合

    各运算类只公共继承Operation类,不涉及其他运算类。

  • 高复用

    无论是控制台,还是windows程序,Web程序,均可使用该程序实现计算器功能。


如果对您有用,欢迎扫描下方二维码关注公众号,会持续输出原创精彩文章,与您一起深入学习Python中好用、好玩的知识。

在这里插入图片描述

posted @ 2019-12-22 12:38  西加加先生  阅读(270)  评论(0编辑  收藏  举报