python版简单工厂模式的介绍

这篇文章主要为大家详细介绍了python版简单工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

什么是简单工厂模式

工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。
简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。如数据库生产工厂就是简单工厂的一个应用
采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;缺点是可实例化的类型在编译期间已经被确定,如果增加新类 型,则需要修改工厂,不符合OCP(开闭原则)的原则。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

简单工厂模式实现

下面考虑《大话设计模式》中的一个例子:
题目:用任意一种面向对象语言实现一个计算器控制台程序。要求输入两个数和运算符号,得到结果。

立即学习“Python免费学习笔记(深入)”;

题目分析:

程序应该做到:(1)可维护;(2)可复用;(3)可扩展;(4)灵活性好。
可维护:就是说代码一处更改,不能产生连锁反应,不能影响其他地方。
可复用:尽量减少重复性代码。
可扩展:如果要扩展新的功能、新的业务,则只需要增加新的类就好了,不对已有的类和逻辑产生影响。插拔式的应用。
面向对象要点:
面向对象三大特性:封装、继承、多态。
通过封装、继承、多态把程序耦合降低。
业务逻辑和界面逻辑分开。

类的结构图:

python版简单工厂模式的介绍

代码实现:

1. 首先,搞清楚业务中容易发生变化的部分。在本应用中,要求计算两个数的运算结果,那么要进行什么样的运算,这就是一个容易发生变化的部分。例如,我们现在只想实现加减乘除运算,后期又想增加开根或者求余运算。那么如何应对这种需求带来的变化。在程序设计的时候就应该考虑到程序的可维护性、可扩展性、代码的可复用性、灵活性等等。 

2. 例如现在这个运算器只有加减乘除四种运算。首先建一个Operation类,这个类是各种具体运算类(加减乘除)的父类,主要是接受用户输入的数值。该类如下:

class Operation():   def __init__(self,NumberA=0,NumberB=0):     self.NumberA = NumberA     self.NumberB = NumberB    def GetResult(self):     pass

登录后复制

3. 然后是具体的运算类:Add、Sub、Mul、p。他们都继承了Operation类,并且重写了getResult()方法。这样就可以用多态性降低不同业务逻辑的耦合度,修改任何一种运算类都不会影响其他的运算类。具体类的代码如下:

class AddOp(Operation):   def GetResult(self):     return self.NumberB + self.NumberA  class MinusOp(Operation):   def GetResult(self):     return self.NumberA - self.NumberB  class MultiOp(Operation):   def GetResult(self):     return self.NumberA * self.NumberB  class pideOp(Operation):   def GetResult(self):     try:       return 1.0*self.NumberA / self.NumberB     except ZeropisionError:       raise

登录后复制

4.  那么如何让计算器知道我是要用哪一种运算呢?也就是说到底要实例化哪一个具体的运算类,Add?Sub?Mul?p?这时就应该考虑用 一个单独的类来做这个创造具体实例的过程,这个类就是工厂类。如下:

class OperationFatory():   def ChooseOperation(self,op):     if op == '+':       return AddOp()     if op == '-':       return MinusOp()     if op == '*':       return MultiOp()     if op == '/':       return pideOp()

登录后复制

5. 这样,用户只要输入运算符,工厂类就可以创建合适的实例,通过多态性,即返回给父类的方式实现运算结果。客户端代码如下:

if __name__ == '__main__':   ch = ''   while not ch=='q':      NumberA = eval(raw_input('Please input number1: '))     op = str(raw_input('Please input the operation: '))     NumberB = eval(raw_input('Please input number2: '))     OPFactory = OperationFatory()     OPType = OPFactory.ChooseOperation(op)     OPType.NumberA = NumberA     OPType.NumberB = NumberB     print 'The result is:',OPType.GetResult()     print '#-- input q to exit any key to continue'     try:       ch = str(raw_input())     except:       ch = ''

登录后复制

完整版代码如下:

# -*-coding:UTF-8-*-  from abc import ABCMeta,abstractmethod  class Operation():   def __init__(self,NumberA=0,NumberB=0):     self.NumberA = NumberA     self.NumberB = NumberB    def GetResult(self):     pass  class AddOp(Operation):   def GetResult(self):     return self.NumberB + self.NumberA  class MinusOp(Operation):   def GetResult(self):     return self.NumberA - self.NumberB  class MultiOp(Operation):   def GetResult(self):     return self.NumberA * self.NumberB  class pideOp(Operation):   def GetResult(self):     try:       return 1.0*self.NumberA / self.NumberB     except ZeropisionError:       raise  class OperationFatory():   def ChooseOperation(self,op):     if op == '+':       return AddOp()     if op == '-':       return MinusOp()     if op == '*':       return MultiOp()     if op == '/':       return pideOp()  if __name__ == '__main__':   ch = ''   while not ch=='q':      NumberA = eval(raw_input('Please input number1: '))     op = str(raw_input('Please input the operation: '))     NumberB = eval(raw_input('Please input number2: '))     OPFactory = OperationFatory()     OPType = OPFactory.ChooseOperation(op)     OPType.NumberA = NumberA     OPType.NumberB = NumberB     print 'The result is:',OPType.GetResult()     print '#-- input q to exit any key to continue'     try:       ch = str(raw_input())     except:       ch = ''

登录后复制

以上就是python版简单工厂模式的介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2265843.html

(0)
上一篇 2025年2月27日 08:58:01
下一篇 2025年2月25日 08:28:33

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python扩展内置类型的实现方法分析

    这篇文章主要介绍了python实现扩展内置类型的方法,结合实例形式分析了python嵌入内置类型扩展及子类方式扩展的具体实现技巧,需要的朋友可以参考下 本文实例讲述了Python实现扩展内置类型的方法。分享给大家供大家参考,具体如下: 简介…

    编程技术 2025年2月27日
    200
  • python中关于logging库的使用总结

    python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用,下面这篇文章主要给大家介绍了关于python中logging库使用的一些知识总结,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。 …

    编程技术 2025年2月27日
    200
  • R vs. Python数据分析详解

    r和python两者谁更适合数据分析领域?在某些特定情况下谁会更有优势?还是一个天生在各方面都比另一个更好? 当我们想要选择一种编程语言进行数据分析时,相信大多数人都会想到R和Python——但是从这两个非常强大、灵活的数据分析语言中二选一…

    2025年2月27日
    200
  • Python操作SQL Server数据库的方法

    0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了sql server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话,实用性就不那么大了。 2.最基本的SQL…

    编程技术 2025年2月27日
    200
  • Python 2.7在Linux下安装或升级的操作方法

    下面小编就为大家带来一篇linux下安装或升级python 2.7的操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 1.准备编译环境gcc 2.去官网下载要安装的对应版本的python的源代码 下载地…

    编程技术 2025年2月27日
    200
  • python实现连接数据库的方法介绍

    这篇文章主要为大家详细介绍了python连接数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 MYSQL模块暂时还不支持python3.0以上的版本,由于我下载的python是3.0版本的,所以想要连接数据库只能利用其它的方法…

    2025年2月27日
    200
  • Python爬虫入门心得分享

    网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。网络爬虫为搜索引擎从万维网下载网页。一般分为传统爬虫和聚焦爬虫。 学爬虫是循序渐进的过程,作为零基础小白,大体上可分为三个阶段,第一阶段是入门,掌握必备的基础知识,第二阶段是模…

    编程技术 2025年2月27日
    200
  • K-means算法在Python中的实现

    k-means是机器学习中一个比较常用的算法,属于无监督学习算法,其常被用于数据的聚类,只需为它指定簇的数量即可自动将数据聚合到多类中,相同簇中的数据相似度较高,不同簇中数据相似度较低。 K-MEANS算法是输入聚类个数k,以及包含 n个数…

    2025年2月27日
    200
  • python matplotlib坐标轴设置的方法

    在使用matplotlib模块时画坐标图时,往往需要对坐标轴设置很多参数,这些参数包括横纵坐标轴范围、坐标轴刻度大小、坐标轴名称等 ,在matplotlib中包含了很多函数,用来对这些参数进行设置。我们可以对坐标轴进行设置,设置坐标轴的范围…

    2025年2月27日 编程技术
    200
  • 用Python语言描述最大连续子序列和

    求最大连续子序列的和是一个很经典很古老的面试题了,本文我们就和大家分享关于用python语言描述最大连续子序列和方法,希望能帮助到大家。 1.问题描述 假设有一数组(python里为list啦)[1,3,-3,4,-6,-1],求数组中最大…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论