需求:有一個學雷鋒活動,有買米和掃地兩個內容,參與的人有大學生和社區志願者,他們各自的方法不同。spa
若是用簡單工廠模式實現:code
#encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大學生幫你買米' def sweep(self): print '大學生幫你掃地' class Volunteer(LeiFeng): def buy_rice(self): print '社區志願者幫你買米' def sweep(self): print '社區志願者幫你掃地' class LeiFengFactory(): def create_lei_feng(self, type): map_ = { '大學生': Student(), '社區志願者': Volunteer() } return map_[type] if __name__ == '__main__': leifeng1 = LeiFengFactory().create_lei_feng('大學生') leifeng2 = LeiFengFactory().create_lei_feng('大學生') leifeng3 = LeiFengFactory().create_lei_feng('大學生') leifeng1.buy_rice() leifeng1.sweep()
寫一個雷鋒類,定義買米和掃地兩個方法,寫一個學生類和社區志願者類,繼承雷鋒類,寫一個工廠類,根據輸入的類型返回學生類或志願者類。blog
用工廠方法模式實現:繼承
#encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大學生幫你買米' def sweep(self): print '大學生幫你掃地' class Volunteer(LeiFeng): def buy_rice(self): print '社區志願者幫你買米' def sweep(self): print '社區志願者幫你掃地' class LeiFengFactory(): def create_lei_feng(self): pass class StudentFactory(LeiFengFactory): def create_lei_feng(self): return Student() class VolunteerFactory(LeiFengFactory): def create_lei_feng(self): return Volunteer() if __name__ == '__main__': myFactory = StudentFactory() leifeng1 = myFactory.create_lei_feng() leifeng2 = myFactory.create_lei_feng() leifeng3 = myFactory.create_lei_feng() leifeng1.buy_rice() leifeng1.sweep()
雷鋒類,大學生類,志願者類和簡單工廠同樣,新寫一個工廠方法基類,定義一個工廠方法接口(工廠方法模式的工廠方法應該就是指這個方法),而後寫一個學生工廠類,志願者工廠類,從新工廠方法,返回各自的類。接口
工廠方法相對於簡單工廠的優勢:utf-8
1.在簡單工廠中,若是須要新增類,例如加一箇中學生類(MiddleStudent),就須要新寫一個類,同時要修改工廠類的map_,加入'中學生':MiddleStudent()。這樣就違背了封閉開放原則中的一個類寫好後,儘可能不要修改裏面的內容,這個原則。而在工廠方法中,須要增長一箇中學生類和一箇中學生工廠類(MiddleStudentFactory),雖然比較繁瑣,可是符合封閉開放原則。在工廠方法中,將判斷輸入的類型,返回相應的類這個過程從工廠類中移到了客戶端中實現,因此當須要新增類是,也是要修改代碼的,不過是改客戶端的代碼而不是工廠類的代碼。社區
2.對代碼的修改會更加方便。例如在客戶端中,須要將Student的實現改成Volunteer,若是在簡單工廠中,就須要把class
leifeng1 = LeiFengFactory().create_lei_feng('大學生')
中的大學生改爲社區志願者,這裏就須要改三處地方,可是在工廠方法中,只須要吧coding
myFactory = StudentFactory()
改爲map
myFactory = VolunteerFactory()
就能夠了