1.python实现设计模式:简单工厂模式,,简单工厂模式1.什么


简单工厂模式

1.什么是简单工厂模式?

  给定一种输入,通过工厂实例出其合适的对象,称为简单工厂模式

2.逐步引入工厂模式

  2.1小文去面试,公司要求用任意一种面对对象的语言实现了一个计算器程序,功能只是简单的两个数相加或者减,乘,除

  他的代码如下

def main():    num1 = int(input(‘The first number is:‘))    num2 = int(input(‘The second number is:‘))    op = input(‘The operator is( + - * /):‘)    if op == ‘+‘:        ret = num1 + num2    elif op == ‘-‘:        ret = num1 - num2    elif op == ‘*‘:        ret = num1 * num2    elif op == ‘/‘:        ret = num1 / num2    return retif __name__ == ‘__main__‘:    ret = main()    print(ret)‘‘‘The first number is:2The second number is:3The operator is( + - * /):+5‘‘‘

  小文等了很久都没有接到公司的通知,小文的哥哥大文看了看小文的代码,摇了摇头:

  1.没有用到面对对象的理念

  2.if esle的效率很低,极端情况下回影响程序的效率

  3.没有考虑除数为0的情况

  4.重用性差,耦合度太高,应使用面对对象编程,将业务逻辑和界面逻辑分开,降低耦合度

  2.2小文修改了代码

  operation运算类:

class Cal:    def __init__(self, num1, num2):        self.num1 = num1        self.num2 = num2    def Add(self):        return self.num1 + self.num2    def Sub(self):        return self.num1 - self.num2    def Mut(self):        return self.num1 * self.num2    def Div(self):        if self.num2 != 0:            return self.num1 / self.num2        else:            return ‘除数不能为0‘

  客户端代码:

DIC = {‘+‘: ‘Add‘,       ‘-‘: ‘Sub‘,       ‘*‘: ‘Mut‘,       ‘/‘: ‘Div‘,       }def main():    num1 = int(input(‘The first number is:‘))    num2 = int(input(‘The second number is:‘))    op = input(‘The operator is( + - * /):‘)    if hasattr(Cal, DIC[op]):        func = getattr(Cal, DIC[op])        obj = Cal(num1, num2)        ret = obj.func()        print(ret)if __name__ == ‘__main__‘:    main()

  大文说:代码耦合性还是很高,假如增加平方根运算,却需要让+-*/都来参加编译

  加减乘除运算应该分离,修改其中一个而不影响其他几个

  增加面对对象集成继承的思想

  2.3 小文修改了代码:

  operation运算类与加减乘除类:

class Cal:    def __init__(self, num1, num2):        self.num1 = num1        self.num2 = num2class Add(Cal):    def GetResult(self):        return self.num1 + self.num2class Sub(Cal):    def GetResult(self):        return self.num1 - self.num2class Mut(Cal):    def GetResult(self):        return self.num1 * self.num2class Div(Cal):    def GetResult(self):        if self.num2 != 0:            return self.num1 / self.num2        else:            return ‘除数不能为0‘

  小文说:我如何才能让计算器知道我是希望用哪个类去创建对象呢?

  大文说:今天就叫你简单工厂模式,你只要输入运算符号,工厂就能实例化出合适的对象

  2.4 大文写了以下代码

  简单工厂类:

import libDIC = {‘+‘: ‘Add‘,       ‘-‘: ‘Sub‘,       ‘*‘: ‘Mut‘,       ‘/‘: ‘Div‘,       }class operationFactory:    @staticmethod    def creatObj(operator, num1, num2):        if hasattr(lib, DIC[operator]):            class1 = getattr(lib, DIC[operator])            obj = class1(num1, num2)            return obj

  客户端代码:

def main():    num1 = int(input(‘The first number is:‘))    num2 = int(input(‘The second number is:‘))    op = input(‘The operator is( + - * /):‘)    obj = operationFactory.creatObj(op, num1, num2)    ret = obj.GetResult()    print(ret)if __name__ == ‘__main__‘:    main()

  大文说:以后我们更改加法算法,只需要改lib.py中的Add就可以了

      当我们需要增加各种复杂运算,只需要增加相应的子类即可,并且在DIC字典中增加相应的元素,方便

      类工厂中的放射能找到对应的类名即可。

  2.5最后我们看一下这几个类的结构图:

技术分享

1.python实现设计模式:简单工厂模式

评论关闭