Python筆記之工廠(chǎng)模式
工廠(chǎng)模式: “工廠(chǎng)”即表示一個(gè)負(fù)責(zé)創(chuàng)建其他類(lèi)型的對(duì)象的類(lèi),通常情況下,一個(gè)工廠(chǎng)的對(duì)象會(huì)有一個(gè)或多個(gè)方法與之關(guān)聯(lián),這些方法用于創(chuàng)建不同類(lèi)型的對(duì)象,工廠(chǎng)對(duì)象會(huì)根據(jù)客戶(hù)端給方法傳遞的不同的參數(shù)或者客戶(hù)端調(diào)用不同的方法返回不同的對(duì)象。
優(yōu)點(diǎn):對(duì)象的創(chuàng)建是可以根據(jù)需要單獨(dú)創(chuàng)建的,但是使用工廠(chǎng)模式來(lái)創(chuàng)建對(duì)象有以下優(yōu)點(diǎn):
- 松耦合,對(duì)象的創(chuàng)建是根據(jù)工廠(chǎng)類(lèi)來(lái)進(jìn)行的,與類(lèi)本身的實(shí)現(xiàn)是獨(dú)立開(kāi)來(lái)的。
- 對(duì)于客戶(hù)端來(lái)說(shuō),不需要知道類(lèi)的具體實(shí)現(xiàn),只需要調(diào)用相應(yīng)接口就可以得到需要的對(duì)象了,這其實(shí)是簡(jiǎn)化了客戶(hù)端的相關(guān)實(shí)現(xiàn)。
- 對(duì)于對(duì)象的修改只需要在工廠(chǎng)里面進(jìn)行即可,包括添加新的對(duì)象,客戶(hù)端只需要更改少量的代碼,甚至可以不修改代碼就可以達(dá)到要求。
- 使用工廠(chǎng)接口,還可以重用已有的對(duì)象,不用去別處調(diào)用已有的對(duì)象或者重新創(chuàng)建一個(gè)對(duì)象。
工廠(chǎng)模式的3種實(shí)現(xiàn)形式(或者說(shuō)3中變體):
- 簡(jiǎn)單工廠(chǎng)模式:工廠(chǎng)類(lèi)會(huì)提供一個(gè)接口,并根據(jù)客戶(hù)端傳入?yún)?shù)來(lái)創(chuàng)建相應(yīng)的實(shí)例對(duì)象。(創(chuàng)建一個(gè)對(duì)象)
- 工廠(chǎng)方法模式:需要定義一個(gè)基類(lèi),不同的子類(lèi)則代表著不同類(lèi)型的對(duì)象。相對(duì)于簡(jiǎn)單工廠(chǎng)模式而言,工廠(chǎng)方法模式具有更強(qiáng)的可定制性。(創(chuàng)建一個(gè)對(duì)象)
- 抽象工廠(chǎng)模式:需要定義一個(gè)抽象工廠(chǎng)類(lèi),然后由不同的子類(lèi)來(lái)創(chuàng)建不同系列的對(duì)象,一個(gè)系列即代表一組對(duì)象。(創(chuàng)建一組對(duì)象)
簡(jiǎn)單工廠(chǎng)模式示例:
from abc import ABCMeta, abstractmethod
class Flower(metaclass=ABCMeta):
@abstractmethod
def show_price(self):
pass
class Rose(Flower):
def show_price(self):
print('Rose price: $99')
class Tulip(Flower):
def show_price(self):
print('Tulip price: $66')
class FlowerSimpleFactory:
def get_flower(self, flower_type):
return eval(flower_type)()
if __name__ == '__main__':
flower_factory = FlowerSimpleFactory()
rose = flower_factory.get_flower('Rose')
tulip = flower_factory.get_flower('Tulip')
rose.show_price()
tulip.show_price()
Rose price: $99 Tulip price: $66
特點(diǎn):接口根據(jù)客戶(hù)端傳入的參數(shù)即可返回對(duì)應(yīng)的實(shí)例對(duì)象,甚至不用返回它的對(duì)象就可以進(jìn)行對(duì)應(yīng)的操作(比如示例中的工廠(chǎng)FlowerSimpleFactory中可以直接定義一個(gè)print_price方法來(lái)打印各種花的價(jià)格,而不是先返回對(duì)象,再由對(duì)象調(diào)用show_price方法來(lái)打?。床粫?huì)暴露對(duì)象的創(chuàng)建邏輯,客戶(hù)端直接使用接口即可完成對(duì)象的創(chuàng)建,甚至創(chuàng)建對(duì)象之后的一些操作。
工廠(chǎng)方法模式示例:
from abc import ABCMeta, abstractmethod
class Flower(metaclass=ABCMeta):
@abstractmethod
def show_price(self):
pass
class Rose(Flower):
def show_price(self):
print('Rose price: $99')
class Tulip(Flower):
def show_price(self):
print('Tulip price: $66')
class Lily(Flower):
def show_price(self):
print('Lily price: $33')
class FlowerShopFactory(metaclass=ABCMeta):
def __init__(self):
self.flowers = []
self.stock_flowers()
@abstractmethod
def stock_flowers(self):
pass
def get_flowers(self):
return self.flowers
def add_flower(self, flower):
self.flowers.append(flower)
class FlowerShop1(FlowerShopFactory):
def stock_flowers(self):
self.add_flower(Rose())
self.add_flower(Tulip())
class FlowerShop2(FlowerShopFactory):
def stock_flowers(self):
self.add_flower(Rose())
self.add_flower(Tulip())
self.add_flower(Lily())
if __name__ == '__main__':
flower_shop1 = FlowerShop1()
for flower in flower_shop1.get_flowers():
flower.show_price()
flower_shop2 = FlowerShop2()
for flower in flower_shop2.get_flowers():
flower.show_price()
Rose price: $99 Tulip price: $66 Rose price: $99 Tulip price: $66 Lily price: $33
特點(diǎn):工廠(chǎng)方法可以根據(jù)基類(lèi)來(lái)定義不同的子類(lèi),如示例中的FlowerShop1和FlowerShop2,每個(gè)子類(lèi)則代表“工廠(chǎng)”可以創(chuàng)建的一個(gè)“產(chǎn)品”。即對(duì)象的創(chuàng)建是通過(guò)繼承的子類(lèi)來(lái)完成的。
抽象工廠(chǎng)模式示例:
from abc import ABCMeta, abstractmethod
class MiniCar(metaclass=ABCMeta):
@abstractmethod
def show_size(self):
pass
class SedanCar(metaclass=ABCMeta):
@abstractmethod
def show_price(self):
pass
# 國(guó)產(chǎn)車(chē)
class DomesticMiniCar(MiniCar):
def show_size(self):
print('Domestic mini car size: 111')
class DomesticSedanCar(SedanCar):
def show_price(self):
print('Domestic sedan car price: 10W')
# 英國(guó)車(chē)
class EnglishMiniCar(MiniCar):
def show_size(self):
print('English mini car size: 222')
class EnglishSedanCar(SedanCar):
def show_price(self):
print('English sedan car price: 30w')
# 抽象工廠(chǎng)類(lèi)
class CarFactory(metaclass=ABCMeta):
@abstractmethod
def create_mini_car(self):
pass
@abstractmethod
def create_sedan_car(self):
pass
# 國(guó)產(chǎn)車(chē)工廠(chǎng)類(lèi)
class DomesticCarFactory(CarFactory):
def create_mini_car(self):
return DomesticMiniCar()
def create_sedan_car(self):
return DomesticSedanCar()
# 英國(guó)車(chē)
class EnglishCarFactory(CarFactory):
def create_mini_car(self):
return EnglishMiniCar()
def create_sedan_car(self):
return EnglishSedanCar()
特點(diǎn):需要定義一個(gè)接口(如示例的抽象工廠(chǎng)類(lèi))來(lái)創(chuàng)建一系列的相關(guān)對(duì)象,如示例中的兩個(gè)子類(lèi)分別創(chuàng)建兩個(gè)系列的對(duì)象(國(guó)產(chǎn)車(chē)和英國(guó)車(chē)),即對(duì)象的創(chuàng)建也是由子類(lèi)來(lái)完成。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺析Python 簡(jiǎn)單工廠(chǎng)模式和工廠(chǎng)方法模式的優(yōu)缺點(diǎn)
- python模式 工廠(chǎng)模式原理及實(shí)例詳解
- Python設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式實(shí)例詳解
- Python設(shè)計(jì)模式之抽象工廠(chǎng)模式原理與用法詳解
- Python設(shè)計(jì)模式之工廠(chǎng)模式簡(jiǎn)單示例
- python3設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式
- python版簡(jiǎn)單工廠(chǎng)模式
- 淺析Python 抽象工廠(chǎng)模式的優(yōu)缺點(diǎn)
相關(guān)文章
對(duì)Python3 解析html的幾種操作方式小結(jié)
今天小編就為大家分享一篇對(duì)Python3 解析html的幾種操作方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
學(xué)習(xí)createTrackbar的使用方法及步驟
這篇文章主要為大家介紹了學(xué)習(xí)createTrackbar的使用方法及步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法整數(shù)規(guī)劃問(wèn)題示例解析
整數(shù)規(guī)劃問(wèn)題在工業(yè)、經(jīng)濟(jì)、國(guó)防、醫(yī)療等各行各業(yè)應(yīng)用十分廣泛,是指規(guī)劃中的變量(全部或部分)限制為整數(shù),屬于離散優(yōu)化問(wèn)題Discrete Optimization2021-10-10
python 實(shí)現(xiàn)人和電腦猜拳的示例代碼
這篇文章主要介紹了python 實(shí)現(xiàn)人和電腦猜拳的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
flask框架自定義過(guò)濾器示例【markdown文件讀取和展示功能】
這篇文章主要介紹了flask框架自定義過(guò)濾器,結(jié)合實(shí)例形式分析了flask基于自定義過(guò)濾器實(shí)現(xiàn)markdown文件讀取和展示功能相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
Python的numpy庫(kù)中將矩陣轉(zhuǎn)換為列表等函數(shù)的方法
下面小編就為大家分享一篇Python的numpy庫(kù)中將矩陣轉(zhuǎn)換為列表等函數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
在Python中操作時(shí)間之tzset()方法的使用教程
這篇文章主要介紹了在Python中操作時(shí)間之tzset()方法的使用教程,是Python學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05

