python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

声明:本系列文章主要参考《精通Python设计模式》一书,并且参考一些资料,结合自己的一些看法来总结而来。

在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对工厂方法进一步抽象化,用于工厂方法本身也需要抽象集中管理的情况。

从工厂模式我们可以知道:

根据用户输入的不同,调用相同的工厂,将会输出不同的结果。

那么抽象工厂模式呢?

根据用户输入的不同,调用相同的接口,去调用不同的工厂进行不同的生产,得出不同的输出结果。(个人理解)

例如:

在编写一款面向全年龄的游戏,游戏本身需要使用工厂方法进行开发。但游戏也需要考虑不同年龄段玩家的需求和口味不同,所以需要为不同年龄段的玩家针对游戏进行一定的修改。于是在用户输入年龄后,运行符合其年龄的要求的游戏。

代码(来自《精通Python设计模式》)

classFrog(object):'''青蛙类'''

def __init__(self,name):

self.name=namedef __str__(self):returnself.namedefinteract_with(self,obstacle):print('{} the Frog encounters {} and {} !'.format(self,obstacle,obstacle.action()))classBug(object):'''臭虫类'''

def __str__(self):return 'a bug'

defaction(self):return 'eats it'

classFrogWorld(object):'''抽象工厂-青蛙世界'''

def __init__(self,name):print(self)

self.player_name=namedef __str__(self):return '----------welcome to FrogWorld-------------'

defmake_character(self):returnFrog(self.player_name)defmake_obstacle(self):returnBug()classWizerd(object):'''巫师类'''

def __init__(self,name):

self.name=namedef __str__(self):returnself.namedefinteract_with(self,obstacle):print('{} the Wizerd battles against {} and {} !'.format(self,obstacle,obstacle.action()))classOrk(object):'''怪兽类'''

def __str__(self):return 'an evil ork'

defaction(self):return 'kills it'

classWizerdWorld(object):'''抽象工厂-巫师世界'''

def __init__(self,name):print(self)

self.player_name=namedef __str__(self):return '--------welcome to WizerdWorld-------------------'

defmake_character(self):returnWizerd(self.player_name)defmake_obstacle(self):returnOrk()classGameEnvironment(object):'''游戏主入口'''

def __init__(self,factory):

self.hero=factory.make_character()

self.obstacle=factory.make_obstacle()defplay(self):

self.hero.interact_with(self.obstacle)defvalidata_age(name):'''验证年龄'''

try:

age= input('welcome {}, How old are you?'.format(name))

age=int(age)exceptException as e:print('Age {} is invalid,please try again...'.format(age))return(False,age)return(True,age)defmain():

name= input("Hello,What's you name?")

valid_input=Falsewhile notvalid_input:

valid_input,age=validata_age(name)

game= FrogWorld if age<18 elseWizerdWorld

environment=GameEnvironment(game(name))

environment.play()if __name__ == '__main__':

main()print('hello world')

解析:

1、通过一个 GameEnvironment 去管理两个游戏:FrogWorld、WizerdWorld ,根据用户输入的不同的年龄去决定其去玩那个游戏,是青蛙世界还是巫师世界呢?

2、而每个游戏类即 FrogWorld、WizerdWorld ,又分别管理着 两个角色 --(Frog青蛙、Bug臭虫)和(Wizerd巫师、Ork怪兽)

其实无论是工厂模式和抽象工厂模式的思想都是一样的,根据不同的输入,调用相同的接口,得出不同的结果。其内部封装了操作流程,用户无需知道其内部如何其实现的如何进行选择,只管输入便可的得到结果。

over~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RESTful API 设计指南

摘自:http://www.ruanyifeng.com/blog/2014/05/restful_api http://www.ruanyifeng.com/blog/2011/09/restful.html 网络应用程序&#xff0c;分为前端和后端两个部分。当前的发展趋势&#xff0c;就是前端设备层出不穷&#xff08;手机、平板、桌面电脑、其他专用设备......&…

C++中的位运算

最近在刷天梯题的时候&#xff0c;发现了<<和>>这两个运算&#xff0c;刚见到的时候简直一脸懵逼&#xff0c;觉得自己很菜&#xff0c;经过自己查找资料&#xff0c;发现原来这两个小东西是位运算符呀。为加深自己的印象&#xff0c;总结如下: 话不多说&#xff0…

node 更新_被创造者嫌弃,Node.js 如何应对来自 Deno 的挑战

(给前端大全加星标&#xff0c;提升前端技能)转自&#xff1a;OSC开源社区JavaScript 运行时 Node.js 于日前更新到了 15 版本&#xff0c;该软件自发布至今已走过了 11 年的岁月。但在今年 5 月&#xff0c;其竞争对手 Deno 也发布了 1.0 版本。Deno 是一个 Javascript/TypeS…

Python模块及其导入

一、模块 1、模块的定义&#xff1a; 为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件里&#xff0c;这样&#xff0c;每个文件包含的代码就相对较少&#xff0c; 很多编程语言都采用这种组织代码的方式。在Python中&#xff0c;一个.py文件…

L1-046 整除光棍 (20 分)

这道题的解题过程真是一波三折&#xff0c;也真是发现人外有人&#xff0c;天外有天&#xff0c;好多神人真是。 原题如下图&#xff0c;也可点击这个链接到原题自己测试光棍原题链接: 一开始做的时候的想法&#xff1a;so easy&#xff0c;虽然看到了题目中提示s可能超级大…

python内存模型_内存篇3:CPython的内存管理架构-L2-块

本篇用到了C/C的内存对齐的基础知识&#xff0c;我已经假定你有C/C内存管理的相关基础。我们在前一篇的流程图中留下了两个黑箱子,会涉及到内存模型第一层以上的其他话题&#xff0c;回顾下面关于第一层面向类型的内存API流程执行图。本篇要讨论其中一个黑箱就是何为物&#xf…

软件测试_入行

软件测试&#xff0c;入行太简单了。1. 看一本软件测试理论书籍 。2. 看一点数据库知识&#xff08;增删改查&#xff09;。3. 看一点Linux常用命令&#xff08;30个够了&#xff09;。4. 了解几个行业内容的测试工具&#xff08;如Jira Zentao LR Jmeter Fiddler 等&#xff0…

L1-056 猜数字 (20 分)

这道题做法倒是多样化&#xff0c;可以使用结构体&#xff0c;也可以使用多个数组做&#xff0c;不过为了复习一下好久没用过的结构体&#xff0c;我是用结构体做的。 这道题可以用来复习一下一些之前的简单的知识点&#xff0c;至于思路的话我相信应该都是有的。 这里就不发运…

uci数据集_数据分析找不到数据集?快来看这个盘点

前言数据集相对于机器学习而言是至关重要的&#xff0c;可以说好的数据集是成功的一半。但是&#xff0c;我们很难找到一个特定的数据集来解决各种机器学习问题&#xff0c;甚至是进行实验。因而找到合适的数据集是一件很难的事情&#xff0c;接下来我们就盘点一下一些优质的数…

git保留两个repo的commit并进行合并

以往的合并时首先要删除repo的.git文件夹&#xff0c;然后重新add-commit-push。带来的问题是会丢失某一个仓库的提交信息&#xff0c;不利于时光倒退。经过摸索终于实现了保留两个仓库提交信息的合并方法。介绍如下&#xff1a; 比如要将DownloadPicsBySeleniumAndPhantomJS这…

安利一款编辑神器——Markdown

经常使用word或者那些浏览器自带编辑器的你可能会和我有时候遇到一样的烦恼&#xff0c;调整格式可真是不容易&#xff0c;如果你也有同样的烦恼&#xff0c;不妨可以试一下Markdown&#xff0c;值得你拥有哈。 Markdown的使用 1.安装使用篇 a.首先安装软件&#xff0c;然后创…

python对图片颜色校正_使用Python PIL更改图像色调

Using Python PIL, Im trying to adjust the hue of a given image.Im not very comfortable with the jargon of graphics, so what I mean by “adjusting hue” is doing the Photoshop operation called “Hue/saturation”: this is to change the color of the image uni…

自动生成业务单据流水号方案

我们在开发管理软件的时候,常常遇到流水号(单据号、登记号)自动生成、控制和管理的问题。由于流水号具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水号重复及断号的问题。特别是多个并发用户同时保存一张同样的业务单据时&#xff0c;系统会返回多个相同的流水…

IDEA快捷键的使用成就手速之旅(要想手速变得快,快捷练习必须刚)

IDEA快捷键的使用 &#xff08;持续更新&#xff09; 1.必备合集 a.Ctrl CtrlF 文本代码查找神器呀简直CrtlR 文本代码替换CtrlZ 撤销&#xff08;基操基操&#xff09;CtrlY 删除当前行或者选中行 b.Shirt c.CtrlShirt d.Ctrlalt e.altShirt f.CtrlShirtalt 2.慢慢积…

一个项目部署多个节点会导致锁失效么_Redis分布式锁

分布式锁在很多场景中是非常有用的原语&#xff0c; 不同的进程必须以独占资源的方式实现资源共享就是一个典型的例子。有很多分布式锁的库和描述怎么实现分布式锁管理器(DLM)的博客,但是每个库的实现方式都不太一样&#xff0c;很多库的实现方式为了简单降低了可靠性&#xff…

GIT_服务器与本地环境构建

linux安装git包 很多yum源上自动安装的git版本为1.7&#xff0c;这里手动编译重新安装1&#xff1a;安装依赖包yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker2&#xff1a;删除已有的gityum remove git3&#xff1a…

Maven项目的基本创建步骤

先来个自己笔记的图片备忘一下&#xff0c;如果以后有时间再慢慢更新详细。

visualvm远程监控jvm_大型企业JVM实战:优化及面试热点分析

本次课程的笔记非常多&#xff0c;而且内容已经整理了好几个小时了&#xff0c;接着下来内容也会更多&#xff0c;也是大型企业JVM性能调优实战的最后一节&#xff0c;希望对你有帮助&#xff01;04&#xff1a;JVM性能监控与故障处理工具 大型企业JVM性能调优实战之总结17&…

Markdown图片路径的改变方法

Markdown图片路径的改变方法 Markdown用时一时爽&#xff0c;路径一改火葬场 Markdown在占用内存少的优点的同时&#xff0c;也注定了图片的存储不会是占用内存&#xff0c;而是根据路径和链接链到md文件里的。 相信有不少人会像我一样在做完一个Markdown笔记后&#xff0c;在…

SROP

title: SROP date: 2018-02-21 19:58:12 categories: 栈溢出 tags: - CTF - PWN - 栈溢出 SROP全称为 Sigreturn Oriented Programming &#xff0c;表明利用sigreturn这个函数实现ROP的技术。 参考资料 http://www.freebuf.com/articles/network/87447.htmlhttp://bobao.360.c…