简单聊聊Python设计模式:抽象工厂模式

1,210 阅读3分钟

📖前言

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

  • 从工厂模式我们可以知道:根据用户输入的不同,调用相同的工厂,将会输出不同的结果。

  • 抽象工厂模式:在工厂方法基础上扩展了工厂对多个产品创建的支持,更适合一些大型系统,比如系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口,像很多软件系统界面中不同主题下不同的按钮、文本框、字体等等。


🚀实例

例如:

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

代码(来自《精通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怪兽)

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


🎉总结

  • 更多参考精彩博文请看这里:《陈永佳的博客》
  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!