python 設(shè)計(jì)模式初級(jí)

面向?qū)ο?/h1>

設(shè)計(jì)模式

===

  1. 簡(jiǎn)單工廠模式

    設(shè)計(jì)一個(gè)商品類和蘋果手機(jī)類,同時(shí)設(shè)計(jì)一個(gè)蘋果手機(jī)專賣店類。蘋果手機(jī)專賣店類可以下訂單和出售手機(jī)。運(yùn)行效果

     ip=IphoneShop()
    
     ip.order()
     ip.order()
     ip.order()
     
     print('庫(kù)存中共有:',IphoneShop.iphone_count,'臺(tái)手機(jī)')
     
     ip.sail()
     ip.sail()
     ip.sail()
     ip.sail()
     
     運(yùn)行結(jié)果:
         iphone X 正在出庫(kù)
         iphone X 正在出庫(kù)
         iphone X 正在出庫(kù)
         庫(kù)存中共有: 3 臺(tái)手機(jī)
         售出一臺(tái)手機(jī),庫(kù)存還有2臺(tái)手機(jī)
         售出一臺(tái)手機(jī),庫(kù)存還有1臺(tái)手機(jī)
         售出一臺(tái)手機(jī),庫(kù)存還有0臺(tái)手機(jī)
         手機(jī)已經(jīng)售完!!請(qǐng)進(jìn)貨
    

    代碼如下

     class Goods(object):
         def __init__(self,brand,price):
             self.price=price
             self.brand=brand
         def outGoods(self):
             print(self.brand,'正在出庫(kù)')
     
     class Iphone(Goods):
         def __init__(self,brand,price,name):
             super(Iphone, self).__init__(brand,price)
             self.name=name
             print(self.name, '正在出庫(kù)')
         def outGoods(self):
             print(self.name,'正在出庫(kù)')
     class Sasung(Goods):
         def __init__(self,brand,price,name,pencil):
             super(Sasung, self).__init__(brand,price)
             self.name=name
             self.pencil=pencil
             print(self.name, '正在出庫(kù)')
         def outGoods(self):
             print(self.name,'正在出庫(kù)')
     
     def createMobile(brand):
         if brand=='apple':
             return Iphone('apple',5600,'iphone X')
         elif brand=='sasung':
             return Sasung('sasung',4600,'galaxy s6','black pencil')
     
     class IphoneShop(object):
         iphone_count = 0
         def __init__(self):
             self.iphone_count = 0
         def order(self):
             IphoneShop.iphone_count += 1
             return createMobile('apple')
     
         def sail(self):
             if IphoneShop.iphone_count>0:
                 IphoneShop.iphone_count -= 1
                 print('售出一臺(tái)手機(jī),庫(kù)存還有{0}臺(tái)手機(jī)'.format(IphoneShop.iphone_count))
             else:
                 print('手機(jī)已經(jīng)售完!!請(qǐng)進(jìn)貨')
     ip=IphoneShop()
     
     ip.order()
     ip.order()
     ip.order()
     
     print('庫(kù)存中共有:',IphoneShop.iphone_count,'臺(tái)手機(jī)')
     
     ip.sail()
     ip.sail()
     ip.sail()
     ip.sail()
    

    工廠模式:

     class Goods(object):
         def __init__(self,brand,price):
             self.price=price
             self.brand=brand
         def outGoods(self):
             print(self.brand,'正在出庫(kù)')
     
     class Iphone(Goods):
         def __init__(self,brand,price,name):
             super(Iphone, self).__init__(brand,price)
             self.name=name
             print(self.name, '正在出庫(kù)')
     class Sasung(Goods):
         def __init__(self,brand,price,name,pencil):
             super(Sasung, self).__init__(brand,price)
             self.name=name
             self.pencil=pencil
             print(self.name, '正在出庫(kù)')
     
     
     # def createMobile(brand):
     #     if brand=='apple':
     #         return Iphone('apple',5600,'iphone X')
     #     elif brand=='sasung':
     #         return Sasung('sasung',4600,'galaxy s6','black pencil')
     
     
     class MobileFactory(object):
         def createMobile(self,brand):
             if brand=='apple':
                 return Iphone('apple',5600,'iphone X')
             elif brand=='sasung':
                 return Sasung('sasung',4600,'galaxy s6','black pencil')
     class Shop(object):
         iphone_count = 0
         def __init__(self):
             self.factory=MobileFactory()
         def order(self,brand):
             IphoneShop.iphone_count += 1
             return self.factory.createMobile(brand)
     
         def sail(self):
             if IphoneShop.iphone_count>0:
                 IphoneShop.iphone_count -= 1
                 print('售出一臺(tái)手機(jī),庫(kù)存還有{0}臺(tái)手機(jī)'.format(IphoneShop.iphone_count))
             else:
                 print('手機(jī)已經(jīng)售完!!請(qǐng)進(jìn)貨')
     ip=Shop()
     
     ip.order('apple')
     ip.order('sasung')
     ip.order('apple')
     
     print('庫(kù)存中共有:',IphoneShop.iphone_count,'臺(tái)手機(jī)')
     
     ip.sail()
     ip.sail()
     ip.sail()
     ip.sail()
    
  2. 工廠方法模式
    簡(jiǎn)單工廠模式中MobileFactory對(duì)象由Shop類初始化來創(chuàng)建,這就決定了Shop只能創(chuàng)建MobileFactory對(duì)象。我們把MobileFactory對(duì)象交給Shop子類來創(chuàng)建,這樣就擴(kuò)展了Shop的功能。如下:

     class Shop(object):
         def createGoods(self,brand):
             pass
         def order(self,brand):
             pass
         def sail(self):
             pass
     
     class MobileShop(Shop):
         Mobile_count=0
         def createGoods(self,brand):
             MobileShop.Mobile_count +=1
             return MobileFactory().createMobile(brand)
         def order(self,brand):
             mobile=self.createGoods(brand)
             print(mobile.name,'手機(jī)到貨,庫(kù)存為', MobileShop.Mobile_count)
             return mobile
         def sail(self):
             if MobileShop.Mobile_count>0:
                 MobileShop.Mobile_count -= 1
                 print('售出一臺(tái)手機(jī),庫(kù)存還有{0}臺(tái)手機(jī)'.format(MobileShop.Mobile_count))
             else:
                 print('手機(jī)已經(jīng)售完!!請(qǐng)進(jìn)貨')
     ip=MobileShop()
     
     ip.order('apple')
     ip.order('sasung')
     ip.order('apple')
     
     
     
     ip.sail()
     ip.sail()
     ip.sail()
     ip.sail()
    
  3. 單例模式預(yù)備 new

    __new__()必須要有返回值,返回實(shí)例化出來的實(shí)例,需要注意的是,可以return父類__new__()出來的實(shí)例,也可以直接將object的__new__()出來的實(shí)例返回。

    init()有一個(gè)參數(shù)self,該self參數(shù)就是new()返回的實(shí)例,init()在new()的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作,init()不需要返回值。

    new()沒有正確返回當(dāng)前類cls的實(shí)例,那init()將不會(huì)被調(diào)用,即使是父類的實(shí)例也不行

    我們可以將類比作制造商,new()方法就是前期的原材料購(gòu)買環(huán)節(jié),init()方法就是在有原材料的基礎(chǔ)上,加工,初始化商品環(huán)節(jié)。

     class A(object):
         def __new__(cls, name,age):
             print('new')
             return object.__new__(cls)
     
         def __init__(self,name,age):
             self.name=name
             self.age=age
     a1=A('tom',12)
     a2=A('tt',16)
     a3=A('ff',16)
    
  4. 單例模式

     class A(object):
         __instance=None
         __first=False
         def __new__(cls, name,age):
             if not cls.__instance:
                 cls.__instance=object.__new__(cls)
     
             return  cls.__instance
     
         def __init__(self,name,age):
             if not A.__first:
                 self.name=name
                 self.age=age
                 A.__first=True
     a1=A('tom',12)
     a2=A('tt',16)
     a3=A('ff',16)
     
     print(id(a1))   
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 參考文獻(xiàn): 《大話設(shè)計(jì)模式》——吳強(qiáng) 《Python設(shè)計(jì)模式》——pythontip.com 《23種設(shè)計(jì)模式》—...
    梁林張斌閱讀 2,297評(píng)論 0 4
  • 8月22日-----字符串相關(guān) 2-3 個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中,并向該用戶顯示一條消息。顯示的消...
    future_d180閱讀 996評(píng)論 0 1
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,801評(píng)論 0 8
  • 初識(shí)面向?qū)ο?楔子 你現(xiàn)在是一家游戲公司的開發(fā)人員,現(xiàn)在需要你開發(fā)一款叫做<人狗大戰(zhàn)>的游戲,你就思考呀,人狗作戰(zhàn)...
    go以恒閱讀 945評(píng)論 0 6
  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個(gè)如下例子,分析運(yùn)行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,080評(píng)論 0 15