python常用設計模式之一 工廠模式

2021-09-24 06:21:05 字數 4096 閱讀 5476

一 工廠方法

(一)工廠模式運用場景

如果因為應用建立物件的**分布在多個不同的地方,而不是僅在乙個函式/方法中,你發 現沒法跟蹤這些物件,那麼應該考慮使用工廠方法模式。

有乙個工廠方法負責連線到不同的資料庫(mysql、sqlite)。

另乙個工廠方法負責建立要求的 幾何物件(圓形、三角形)。

若需要將物件的建立和使用解耦,工廠方法也能派上用場。

工廠方法可以在必要時建立新的物件,從而提高效能和記憶體使用率。

(二)工廠模式案例

import xml.etree.elementtree as etree

import json

class jsonconnector:

def __init__(self, filepath):

self.data = dict()

with open(filepath, mode='r') as f:

self.data = json.load(f)

@property

def parsed_data(self):

return self.data

class xmlconnector:

def __init__(self, filepath):

self.tree = etree.parse(filepath)

@property

def parsed_data(self):

return self.tree

def connection_factory(filepath):

if filepath.endswith('json'):

connector = jsonconnector

elif filepath.endswith('xml'):

connector = xmlconnector

else:

raise valueerror('cannot connect to {}'.format(filepath))

return connector(filepath)

def connect_to(filepath):

factory = none

try:

factory = connection_factory(filepath)

except valueerror as ve:

print(ve)

return factory

if __name__ == '__main__':

# 要那個傳哪個,不占用記憶體

sqlite_factory = connect_to('person.sq3')

xml_factory = connect_to('person.xml')

json_factory = connect_to('person.json')

二 抽象工廠

(一)什麼事抽象工廠

乙個抽象工廠是(邏輯上的)一組工廠方法,其中的每個工廠方法負責產生不同種類的物件。

(二)應用場景

程式包django_factory是乙個用於在測試中建立django模型的抽象工廠實現,可用來為支援測試專有屬性的模型建立例項。這能讓測試**的可讀性更高,且能避免共享不必要的**,故有其存在的價值。

通常一開始時使用工廠方法,因為它更簡單。如果後來發現應用需要許多任務廠方法,那麼將建立一系列物件的過程合併在一起更合理,從而最終引入抽象工廠。

抽象工廠能夠通過改變啟用的工廠方法動態地(執行時)改變應用行為。

(三)應用案例

class frog:    # 青蛙類

def __init__(self, name):

self.name = name

def __str__(self):

return self.name

def interact_with(self, obstacle):

print('{} the frog encounters {} and {}!'.format(self,

obstacle, obstacle.action()))

class bug: # 蟲子類

def __str__(self):

return 'a bug'

def action(self):

return 'eats it'

class frogworld: # 青蛙遊戲

def __init__(self, name):

print(self)

self.player_name = name

def __str__(self):

return '\n\n\t------ frog world -------'

def make_character(self):

return frog(self.player_name)

def make_obstacle(self):

return bug()

class wizard: # 男巫類

def __init__(self, name):

self.name = name

def __str__(self):

return self.name

def interact_with(self, obstacle):

print('{} the wizard battles against {} and {}!'.format(self, obstacle, obstacle.action()))

class ork: # 獸人

def __str__(self):

return 'an evil ork'

def action(self):

return 'kills it'

class wizardworld: # 男巫遊戲

def __init__(self, name):

print(self)

self.player_name = name

def __str__(self):

return '\n\n\t------ wizard world -------'

def make_character(self):

return wizard(self.player_name)

def make_obstacle(self):

return ork()

class gameenvironment:

def __init__(self, factory):

self.hero = factory.make_character()

self.obstacle = factory.make_obstacle()

def play(self):

self.hero.interact_with(self.obstacle)

def validate_age(name):

try:

age = raw_input('welcome {}. how old are you? '.format(name))

age = int(age)

except valueerror as err:

print("age {} is invalid, please try again...".format(age))

return (false, age)

return (true, age)

def main():

name = raw_input("hello. what's your name? ")

valid_input = false

while not valid_input:

valid_input, age = validate_age(name)

game = frogworld if age < 18 else wizardworld

environment = gameenvironment(game(name))

environment.play()

if __name__ == '__main__':

main()

python設計模式之一 單例模式

在物件導向的世界裡,物件是對客觀事物的抽象,類是對物件的抽象。它們之間的關係是,物件是類的例項,類是物件的模板。這段文字表述起來費勁,理解起來也費勁,還是講生活中的例子吧。比如說 大河 一聯想到這個詞,不同的人腦海中的印象是不一樣的,有的是 大漠孤煙直,長河落日圓 有的是 春江潮水連海平,海上明月共...

設計模式之一(Iterator模式)

表 1 1 類和介面的一覽表 名字說明 aggregate 表示集合的介面 iterator 遍歷集合的介面 book 表示書的類 bookshelf 表示書架的類 bookshelfiterator 遍歷書架的類 main 測試程式行為的類 aggregate介面 public inte ce a...

Free Talk 設計模式 之一

早就在看設計模式了,一直很零散。這次alex組織設計模式系列freetalk真是大好的機會,正好系統學習一下,好好學習,天天向上 也沒有筆記,講的時候蠻有感覺的,把自己的理解趕快寫下來,以後也好有地方查。第一課是抽象方法,或者抽象工廠方法?大概是這個名字吧。乙個簡單的例子是人吃奶粉的例子 class...