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

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

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

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

 那么抽象工厂模式呢?

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

  例如:

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

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

  

class Frog(object):
'''青蛙类'''
def __init__(self,name):
self.name = name def __str__(self):
return self.name def interact_with(self,obstacle):
print('{} the Frog encounters {} and {} !'.format(self,obstacle,obstacle.action())) class Bug(object):
'''臭虫类'''
def __str__(self):
return 'a bug'
def action(self):
return 'eats it' class FrogWorld(object):
'''抽象工厂-青蛙世界'''
def __init__(self,name):
print(self)
self.player_name = name def __str__(self):
return '----------welcome to FrogWorld-------------' def make_character(self):
return Frog(self.player_name) def make_obstacle(self):
return Bug() class Wizerd(object):
'''巫师类'''
def __init__(self,name):
self.name = name def __str__(self):
return self.name def interact_with(self,obstacle):
print('{} the Wizerd battles against {} and {} !'.format(self,obstacle,obstacle.action())) class Ork(object):
'''怪兽类'''
def __str__(self):
return 'an evil ork' def action(self):
return 'kills it' class WizerdWorld(object):
'''抽象工厂-巫师世界'''
def __init__(self,name):
print(self)
self.player_name = name def __str__(self):
return '--------welcome to WizerdWorld-------------------' def make_character(self):
return Wizerd(self.player_name) def make_obstacle(self):
return Ork() class GameEnvironment(object):
'''游戏主入口'''
def __init__(self,factory):
self.hero = factory.make_character()
self.obstacle = factory.make_obstacle() def play(self):
self.hero.interact_with(self.obstacle) def validata_age(name):
'''验证年龄'''
try:
age = input('welcome {}, How old are you?'.format(name))
age = int(age)
except Exception as e:
print('Age {} is invalid,please try again...'.format(age))
return(False,age)
return(True,age) def main():
name = input("Hello,What's you name?")
valid_input = False
while not valid_input:
valid_input,age = validata_age(name)
game = FrogWorld if age<18 else WizerdWorld
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~~~~

最新文章

  1. List&lt;T&gt;Find方法,FindAll方法,Contains方法,Equals方法
  2. 数据库范式(1NF 2NF 3NF BCNF)详解一
  3. C语言中的宏总结
  4. iOS 指纹解锁
  5. Java线程(学习整理)--3--简单的死锁例子
  6. leetcode Letter Combinations of a Phone Number python
  7. SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2
  8. 华为OJ之最长公共子序列
  9. 金明的预算方案 NOIP 2006 提高组
  10. Inno Setup
  11. [转]C++ 初始化列表的初始化顺序
  12. VBC#代码互转工具
  13. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列
  14. AirBnB春招笔试题
  15. python基础篇_004_装饰器函数
  16. jQuery初识、函数、对象
  17. 20165214 2018-2019-2 《网络对抗技术》Exp4 恶意代码分析 Week6
  18. Codeforces 1144G Two Merged Sequences dp
  19. File操作-将txt里的内容写入到数据库表
  20. openvswitch vlan下的虚拟机与物理机通信

热门文章

  1. vue - 小日历项目制作中的问题与解决思路
  2. java 压缩图片(只缩小体积,不更改图片尺寸)
  3. csv文件处理
  4. bat无线热点设置
  5. Hibernate通过createSQLQuery( )方法实现增删改查
  6. Swagger2.9.2进入API界面报NumberFormatException异常
  7. .NET 微服务 学习目录
  8. Alpha冲刺——测试篇
  9. django中配置使用celery
  10. recttransform