一 工廠方法
(一)工廠模式運用場景
如果因為應用建立物件的**分布在多個不同的地方,而不是僅在乙個函式/方法中,你發 現沒法跟蹤這些物件,那麼應該考慮使用工廠方法模式。
有乙個工廠方法負責連線到不同的資料庫(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...