Python筆記之工廠模式
工廠模式: “工廠”即表示一個負責創(chuàng)建其他類型的對象的類,通常情況下,一個工廠的對象會有一個或多個方法與之關(guān)聯(lián),這些方法用于創(chuàng)建不同類型的對象,工廠對象會根據(jù)客戶端給方法傳遞的不同的參數(shù)或者客戶端調(diào)用不同的方法返回不同的對象。
優(yōu)點:對象的創(chuàng)建是可以根據(jù)需要單獨創(chuàng)建的,但是使用工廠模式來創(chuàng)建對象有以下優(yōu)點:
- 松耦合,對象的創(chuàng)建是根據(jù)工廠類來進行的,與類本身的實現(xiàn)是獨立開來的。
- 對于客戶端來說,不需要知道類的具體實現(xiàn),只需要調(diào)用相應(yīng)接口就可以得到需要的對象了,這其實是簡化了客戶端的相關(guān)實現(xiàn)。
- 對于對象的修改只需要在工廠里面進行即可,包括添加新的對象,客戶端只需要更改少量的代碼,甚至可以不修改代碼就可以達到要求。
- 使用工廠接口,還可以重用已有的對象,不用去別處調(diào)用已有的對象或者重新創(chuàng)建一個對象。
工廠模式的3種實現(xiàn)形式(或者說3中變體):
- 簡單工廠模式:工廠類會提供一個接口,并根據(jù)客戶端傳入?yún)?shù)來創(chuàng)建相應(yīng)的實例對象。(創(chuàng)建一個對象)
- 工廠方法模式:需要定義一個基類,不同的子類則代表著不同類型的對象。相對于簡單工廠模式而言,工廠方法模式具有更強的可定制性。(創(chuàng)建一個對象)
- 抽象工廠模式:需要定義一個抽象工廠類,然后由不同的子類來創(chuàng)建不同系列的對象,一個系列即代表一組對象。(創(chuà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
特點:接口根據(jù)客戶端傳入的參數(shù)即可返回對應(yīng)的實例對象,甚至不用返回它的對象就可以進行對應(yīng)的操作(比如示例中的工廠FlowerSimpleFactory中可以直接定義一個print_price方法來打印各種花的價格,而不是先返回對象,再由對象調(diào)用show_price方法來打印),即不會暴露對象的創(chuàng)建邏輯,客戶端直接使用接口即可完成對象的創(chuàng)建,甚至創(chuà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
特點:工廠方法可以根據(jù)基類來定義不同的子類,如示例中的FlowerShop1和FlowerShop2,每個子類則代表“工廠”可以創(chuàng)建的一個“產(chǎn)品”。即對象的創(chuà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 # 國產(chǎn)車 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') # 英國車 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') # 抽象工廠類 class CarFactory(metaclass=ABCMeta): @abstractmethod def create_mini_car(self): pass @abstractmethod def create_sedan_car(self): pass # 國產(chǎn)車工廠類 class DomesticCarFactory(CarFactory): def create_mini_car(self): return DomesticMiniCar() def create_sedan_car(self): return DomesticSedanCar() # 英國車 class EnglishCarFactory(CarFactory): def create_mini_car(self): return EnglishMiniCar() def create_sedan_car(self): return EnglishSedanCar()
特點:需要定義一個接口(如示例的抽象工廠類)來創(chuàng)建一系列的相關(guān)對象,如示例中的兩個子類分別創(chuàng)建兩個系列的對象(國產(chǎn)車和英國車),即對象的創(chuàng)建也是由子類來完成。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python數(shù)學(xué)建模學(xué)習模擬退火算法整數(shù)規(guī)劃問題示例解析
整數(shù)規(guī)劃問題在工業(yè)、經(jīng)濟、國防、醫(yī)療等各行各業(yè)應(yīng)用十分廣泛,是指規(guī)劃中的變量(全部或部分)限制為整數(shù),屬于離散優(yōu)化問題Discrete Optimization2021-10-10flask框架自定義過濾器示例【markdown文件讀取和展示功能】
這篇文章主要介紹了flask框架自定義過濾器,結(jié)合實例形式分析了flask基于自定義過濾器實現(xiàn)markdown文件讀取和展示功能相關(guān)操作技巧,需要的朋友可以參考下2019-11-11Python的numpy庫中將矩陣轉(zhuǎn)換為列表等函數(shù)的方法
下面小編就為大家分享一篇Python的numpy庫中將矩陣轉(zhuǎn)換為列表等函數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04