ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-22 12:58:08  阅读:181  来源: 互联网

标签:return 运算 Python 大话 conver strNumber Operation 设计模式 self


简单工厂模式(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中好用、好玩的知识。

在这里插入图片描述

标签:return,运算,Python,大话,conver,strNumber,Operation,设计模式,self
来源: https://www.cnblogs.com/ghostlee/p/12079488.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有