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

简单工厂模式

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 最后我们看一下这几个类的结构图:

时间: 2024-10-15 03:46:31

1.python实现设计模式:简单工厂模式的相关文章

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

1.大话设计模式-简单工厂模式

编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承.封装.多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用. 下面是服务器计算器代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <s

PHP经典设计模式--简单工厂模式

PHP经典设计模式--简单工厂模式 pfinal介绍 本来我们要获取一个类的实例,需要用到new关键字.但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方. 工厂模式,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例. 实现 SimpleFactory.php <?php namespace DesignPatterns

Python 设计模式--简单工厂模式

简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算器 代码: 1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 class Operation: 5 def getResult(self): 6 pass 7 8 class OperationAdd(Operation): 9 def getResul

C#设计模式——简单工厂模式

一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂模式的介绍 说到简单工厂,自然的第一个疑问当然就是什么是简单工厂模式了?所有面向对象的编程都是在我们生活中存在的,从词义的解释就是我们生活中的工厂就是负责生产产品的,而到开发中对应的就是NEW不同的对象,该模式主要解决的问题就是解决创建对象与该类的解耦.设计原则中经常说的类单一职责.封装性都有体现.

3. 星际争霸之php设计模式--简单工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!============================================================================== 上次用星际争霸讨论了面向对象的基础知识

设计模式—简单工厂模式

设计模式之简单工厂模式 看书学习设计模式,书本来源<大话设计模式>,啃一啃怎么样设计程序 在"大话"这本书中写简单工厂模式用计算器为例来说明,其实是最简单的面向接口的编程思维,不依赖与具体的实现,而重点考虑接口.这是比较重要的思维上的转变. 重点: 1.通过继承,造成多态属性,然后在子类中实现父类的接口,在不同的子类中进行不同的接口实现.直接调用实现的接口方法得到最后的值,这一种思维够趣味 2.做增量,尽量不修改之前的,靠增加代码来更改需求 3.最通俗的说法,高内聚,低耦合

C# 设计模式 简单工厂模式

设计模式(C#版)--简单工厂模式 为什么要用设计模式? 1.设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上. 2.设计模式使程序易读.熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序. 3.设计模式能使编写的程序具有良好的可扩展性,满足系统设计的开闭原则.比如策略模式,就是将不同的算法封装在子类中,在需要添加新的算法时,只需添加新的子类,实现规定的接口,即可在不改变现有系统源码的情况下加入新的系统行为. 4.设计模式能降低系统中类与类之间的耦合度.比如工厂

JAVA 设计模式 简单工厂模式

用途 简单工厂模式 (Simple Factory) 又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例. 简单工厂模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 但是简单工厂模式不属于23种Gof设计模式之一. 结构 如何实现一个具有加减乘除基本功能的计算器? 对于这四种运算来说,都需要两个操作数,差别仅在于返回的结果不同. 由此,我们可以抽象化它们的共性,提炼出一个父类.这个类中包含