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

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

  

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

 

posted @ 2018-11-08 11:44 Little_five 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值