声明:本系列文章主要参考《精通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~~~~

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

  1. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  2. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  3. python方法解析顺序_浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  4. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  5. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  6. python数据类型转换原因_浅谈Python数据类型之间的转换

    Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 compl ...

  7. python打开方式错误_浅谈python 调用open()打开文件时路径出错的原因

    昨晚搞鼓了一下python的open()打开文件 代码如下 def main(): infile =open("C:\Users\Spirit\Desktop\bc.txt",'r ...

  8. python 中arange函数_浅谈Python中range与Numpy中arange的比较

    本文先比较range与arange的异同点,再详细介绍各自的用法,然后列举了几个简单的示例,最后对xrange进行了简单的说明. 1. range与arange的比较 (1)相同点:A.参数的可选性. ...

  9. python列表使用判断_浅谈Python数据类型判断及列表脚本操作

    数据类型判断 在python(版本3.0以上)使用变量,并进行值比较时.有时候会出现以下错误: TypeError: unorderable types: NoneType() < int() ...

最新文章

  1. springboot 分层_限量!阿里Spring Boot成长笔记终开源!理论实战满满
  2. 【c语言】测量最长字符串
  3. 平衡二叉树的构造_LeetCode 题解 | 110.平衡二叉树
  4. yota3墨水屏设置_国产墨水屏“手写平板”评测,10.3英寸大屏,支持无纸化办公...
  5. 常考数据结构与算法:二叉树的镜像
  6. 请问为什么像cellspacing=0和bgcolor=red的属性在style里面不起作用呢?
  7. Dockerfile项目环境介绍
  8. HTTP 协议的三次握手
  9. 1. VIM 系列 - 简单入门,拾起兴趣
  10. TIMING_01 时序约束与时序分析引导篇
  11. 如何读取tensorboard文件 展现可视化
  12. mysql 时间 本周 本月_不要再等了,储蓄国债发行又被取消,本周还有两批国债能不能买...
  13. 基于DEAP库的python进化算法--遗传算法实践--非线性函数寻优
  14. ERROR - ORA-12560: TNS:protocol adapter error
  15. 免费下载“百度文库”文档方法,简单而强大~
  16. 小米笔记本12.5java_小米12.5笔记本系统
  17. c语言 大写字母转换为小写字母后的第五个,将大写字母转换为对应小写字母之后的第5字母;若小写字母为v~z,使小写字母的值减21。...
  18. Centos 搭建 FastFDS 分布式文件存储系统
  19. java注释规范_Java代码注释规范详解
  20. 交换机下接路由器lan还是wan_小白请教,自家网络搭建中,光猫、交换机、无线路由器、NAS布线问题...

热门文章

  1. 发消息给非windows窗体程序
  2. 如何停止运行在服务器的项目,怎么启动和停止服务器
  3. linux组类型,LINUX用户以及用户组
  4. rocketmq 初探(四)
  5. HTML5 Web 存储(localStorage和sessionStorage)
  6. Invalid connection string format, a valid format is: host:port:sid
  7. php ajax session死锁,session过期,ajax请求处理
  8. jmeter校验结果_Jenkins在实际失败时验证JMeter构建是否成功
  9. centos7配置jdk1.8环境变量
  10. 1058. A+B in Hogwarts (20)