美文网首页
浅谈Python设计模式 - 抽象工厂模式

浅谈Python设计模式 - 抽象工厂模式

作者: Littlefive的微博 | 来源:发表于2019-11-22 20:58 被阅读0次

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

相关文章

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 浅谈Python设计模式 - 抽象工厂模式

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

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 单件设计模式

    一、定义 设计模式 设计模式就是一种更好的编写代码方案。 常见设计模式 工厂设计模式、抽象工厂设计模式、抽象工厂设...

  • Android 源码设计模式解析与实战 读书笔记 6 抽象工厂模

    创建型设计模式 —— 抽象工厂模式 1. 抽象工厂模式介绍 抽象工厂模式(Abstract Factory Pat...

  • 设计模式系列-抽象工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 抽象工厂模式 抽象工厂模式 定义 抽象工...

  • Go语言设计模式(3)抽象工厂模式

    Go语言设计模式(3)抽象工厂模式 抽象工厂模式的定义 抽象工厂模式的定义如下: Provide an inter...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 创建型设计模式

    一 . 工厂模式 二. 抽象工厂设计模式

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

网友评论

      本文标题:浅谈Python设计模式 - 抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/vntcwctx.html