Python設計模式——工廠方法模式(FactoryMethod)

需求:有一個學雷鋒活動,有買米和掃地兩個內容,參與的人有大學生和社區志願者,他們各自的方法不同。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()

就能夠了

相關文章
相關標籤/搜索