zoukankan      html  css  js  c++  java
  • 《大话设计模式》——简单工厂模式(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中好用、好玩的知识。

    在这里插入图片描述

  • 相关阅读:
    移动端web初体验
    网页布局框架
    CSS 3D翻转相册动画特效
    move.js框架
    js照片墙拖拽特效
    团队编程项目作业2-团队编程项目开发环境搭建过程
    课后作业-阅读任务-阅读提问-1
    团队编程项目作业3
    阅读提问-2
    结对编程项目作业5
  • 原文地址:https://www.cnblogs.com/ghostlee/p/12079488.html
Copyright © 2011-2022 走看看