最近使用Python 寫程式,心血來潮,使用 (
DP) 套用看看。
以 Factory worker 為例。
首先建立一個物件Worker 包含姓名、屬性等等。
class Worker:
def __init__(self, name=None):
self.name = capfirst(name) if name else "The worker"
def getName(self):
return self.name
def attrib(self): return "Worker"
def lookandfeel(self):
print "%s is a %s" % (self.name, self.attrib()) |
Designer與Engineer繼承它,並覆寫attrib() Method。
class Designer(Worker):
def attrib(self): return "Designer"
class Engineer(Worker):
def attrib(self): return "Engineer" |
當使用各自物件來建立,並執行lookandfeel() 時,會呼叫各自的attrib method。
以下使用 factory pattern 來實作僱用workers 的容器物件。
# factory pattern
class Factory:
type_designer = 1
type_engineer = 2
def __init__(self):
self.workers = []
def employ(self, worker_type, name=None):
if worker_type == Factory.type_designer:
self.workers.append(Designer(name))
elif worker_type == Factory.type_engineer:
self.workers.append(Engineer(name))
def workerCount(self):
return len(self.workers)
def browse(self):
for a in self.workers:
a.lookandfeel()
z = Factory()
z.employ(Factory.type_designer)
z.employ(Factory.type_designer, 'bill')
z.employ(Factory.type_engineer, 'sue')
z.browse() |
執行結果:
$ python factory_dp1.py
The worker is a Designer
Bill is a Designer
Sue is a Engineer |
承上篇
重構一文:我們來重構一下它,並加入singleton pattern(利用@staticmethod 來實作)。
class Factory:
# class static variable
type_designer = "1"
type_engineer = "2"
_Factoryself = None
_factorydict = { type_designer: Designer, type_engineer: Engineer, } def __init__(self):
self.workers = []
@staticmethod def singleton(): if Factory._Factoryself == None: Factory._Factoryself = Factory() return Factory._Factoryself
def employ(self, worker_type, name=None):
caller = Factory._factorydict.get(worker_type) if caller: self.workers.append(caller(name)) return None
def workerCount(self):
return len(self.workers)
def browse(self):
i = 0
for a in self.workers:
print " - Worker[%s]:%s" % (i, a.getLookandfeel())
i+=1
def main():
f = Factory.singleton() f2 = Factory.singleton() if f == f2: print "* Singleton pattern of Factory"
print "* Factory pattern to employ"
f.employ(Factory.type_designer)
f.employ(Factory.type_designer, 'Bill')
f.employ(Factory.type_engineer, 'Sue')
print "* Factory pattern to browse"
f.browse()
print "* The factory has %s workers." % f.workerCount()
if __name__ == "__main__":
main() |
小結
使用python 來寫DP程式,功能強大,自由度高;
但這意味,寫其程式時,要有其紀律,遵守一定規範(
coding convention)來寫;
不然程式會變得非常難讀及維護。 最近上列範例程式均可在
github-class_dp中找到。
上述範例還可進一步,重構或修改為工廠人員管理系統的雛形,留待有興趣的讀者們來添加!