码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-06-27 00:55:00      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:ber   res   put   method   ati   stat   actor   http   逻辑   

简单工厂模式

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 ret


if __name__ == ‘__main__‘:
    ret = main()
    print(ret)
‘‘‘
The first number is:2
The second number is:3
The 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 = num2


class Add(Cal):
    def GetResult(self):
        return self.num1 + self.num2


class Sub(Cal):
    def GetResult(self):
        return self.num1 - self.num2


class Mut(Cal):
    def GetResult(self):
        return self.num1 * self.num2


class Div(Cal):
    def GetResult(self):
        if self.num2 != 0:
            return self.num1 / self.num2
        else:
            return ‘除数不能为0‘

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

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

 

  2.4 大文写了以下代码

  简单工厂类:

import lib

DIC = {‘+‘: ‘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实现设计模式:简单工厂模式

标签:ber   res   put   method   ati   stat   actor   http   逻辑   

原文地址:http://www.cnblogs.com/wuwen19940508/p/7082166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!