面向?qū)ο?/h1>
設(shè)計(jì)模式
===
-
簡(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)售完8忍丁净响!請(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)售完T辍别惦!請(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)售完7蛲帧!請(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()
-
工廠方法模式
簡(jiǎn)單工廠模式中MobileFactory對(duì)象由Shop類初始化來(lái)創(chuàng)建氯庆,這就決定了Shop只能創(chuàng)建MobileFactory對(duì)象蹭秋。我們把MobileFactory對(duì)象交給Shop子類來(lái)創(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)售完J底颉洞豁!請(qǐng)進(jìn)貨') ip=MobileShop() ip.order('apple') ip.order('sasung') ip.order('apple') ip.sail() ip.sail() ip.sail() ip.sail()
-
單例模式預(yù)備 new
__new__()必須要有返回值,返回實(shí)例化出來(lái)的實(shí)例荒给,需要注意的是丈挟,可以return父類__new__()出來(lái)的實(shí)例,也可以直接將object的__new__()出來(lái)的實(shí)例返回志电。
init()有一個(gè)參數(shù)self曙咽,該self參數(shù)就是new()返回的實(shí)例,init()在new()的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作挑辆,init()不需要返回值例朱。
若new()沒(méi)有正確返回當(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)
-
單例模式
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))