溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python筆記之工廠模式

發(fā)布時間:2020-10-19 10:16:43 來源:腳本之家 閱讀:134 作者:谷雨yun 欄目:開發(fā)技術(shù)

工廠模式: “工廠”即表示一個負(fù)責(zé)創(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ù)工廠類來進(jìn)行的,與類本身的實現(xiàn)是獨立開來的。
  • 對于客戶端來說,不需要知道類的具體實現(xiàn),只需要調(diào)用相應(yīng)接口就可以得到需要的對象了,這其實是簡化了客戶端的相關(guān)實現(xiàn)。
  • 對于對象的修改只需要在工廠里面進(jìn)行即可,包括添加新的對象,客戶端只需要更改少量的代碼,甚至可以不修改代碼就可以達(dá)到要求。
  • 使用工廠接口,還可以重用已有的對象,不用去別處調(diào)用已有的對象或者重新創(chuàng)建一個對象。

工廠模式的3種實現(xiàn)形式(或者說3中變體):

  • 簡單工廠模式:工廠類會提供一個接口,并根據(jù)客戶端傳入?yún)?shù)來創(chuàng)建相應(yīng)的實例對象。(創(chuàng)建一個對象)
  • 工廠方法模式:需要定義一個基類,不同的子類則代表著不同類型的對象。相對于簡單工廠模式而言,工廠方法模式具有更強(qiá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)的實例對象,甚至不用返回它的對象就可以進(jìn)行對應(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é)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI