淺談Python設(shè)計(jì)模式 - 抽象工廠模式

??聲明:本系列文章主要參考《精通Python設(shè)計(jì)模式》一書摔桦,并且參考一些資料诊赊,結(jié)合自己的一些看法來總結(jié)而來栋盹。

在上一篇我們對工廠模式中的普通工廠模式有了一定的了解笙各,其實(shí)抽象工作就是 表示針對工廠方法進(jìn)一步抽象化,用于工廠方法本身也需要抽象集中管理的情況邦鲫。

從工廠模式我們可以知道:
  根據(jù)用戶輸入的不同灸叼,調(diào)用相同的工廠,將會輸出不同的結(jié)果。

那么抽象工廠模式呢怜姿?
  根據(jù)用戶輸入的不同慎冤,調(diào)用相同的接口,去調(diào)用不同的工廠進(jìn)行不同的生產(chǎn)沧卢,得出不同的輸出結(jié)果蚁堤。(個人理解)

例如:

在編寫一款面向全年齡的游戲,游戲本身需要使用工廠方法進(jìn)行開發(fā)但狭。但游戲也需要考慮不同年齡段玩家的需求和口味不同披诗,所以需要為不同年齡段的玩家針對游戲進(jìn)行一定的修改。于是在用戶輸入年齡后立磁,運(yùn)行符合其年齡的要求的游戲呈队。

代碼(來自《精通Python設(shè)計(jì)模式》)

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):
    '''驗(yàn)證年齡'''
    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 宪摧,根據(jù)用戶輸入的不同的年齡去決定其去玩那個游戲,是青蛙世界還是巫師世界呢颅崩?

?2几于、而每個游戲類即 FrogWorld、WizerdWorld 沿后,又分別管理著 兩個角色 --(Frog青蛙沿彭、Bug臭蟲)和(Wizerd巫師、Ork怪獸)

其實(shí)無論是工廠模式和抽象工廠模式的思想都是一樣的尖滚,根據(jù)不同的輸入喉刘,調(diào)用相同的接口,得出不同的結(jié)果漆弄。其內(nèi)部封裝了操作流程睦裳,用戶無需知道其內(nèi)部如何其實(shí)現(xiàn)的如何進(jìn)行選擇,只管輸入便可的得到結(jié)果撼唾。

over~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廉邑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子券坞,更是在濱河造成了極大的恐慌,老刑警劉巖肺素,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恨锚,死亡現(xiàn)場離奇詭異,居然都是意外死亡倍靡,警方通過查閱死者的電腦和手機(jī)猴伶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人他挎,你說我怎么就攤上這事筝尾。” “怎么了办桨?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵筹淫,是天一觀的道長。 經(jīng)常有香客問我呢撞,道長损姜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任殊霞,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘康铭。我一直安慰自己修档,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布祝钢。 她就那樣靜靜地躺著比规,像睡著了一般。 火紅的嫁衣襯著肌膚如雪太颤。 梳的紋絲不亂的頭發(fā)上苞俘,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音龄章,去河邊找鬼吃谣。 笑死,一個胖子當(dāng)著我的面吹牛做裙,可吹牛的內(nèi)容都是我干的岗憋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼锚贱,長吁一口氣:“原來是場噩夢啊……” “哼仔戈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拧廊,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤监徘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吧碾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凰盔,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年倦春,在試婚紗的時候發(fā)現(xiàn)自己被綠了户敬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落剪。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尿庐,靈堂內(nèi)的尸體忽然破棺而出忠怖,到底是詐尸還是另有隱情,我是刑警寧澤抄瑟,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布凡泣,位于F島的核電站,受9級特大地震影響锐借,放射性物質(zhì)發(fā)生泄漏问麸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一钞翔、第九天 我趴在偏房一處隱蔽的房頂上張望严卖。 院中可真熱鬧,春花似錦布轿、人聲如沸哮笆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稠肘。三九已至,卻和暖如春萝毛,著一層夾襖步出監(jiān)牢的瞬間项阴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工笆包, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留环揽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓庵佣,卻偏偏與公主長得像歉胶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巴粪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容