淺談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~~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM