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


需求:有一個學雷鋒活動,有買米和掃地兩個內容,參與的人有大學生和社區志願者,他們各自的方法不一樣。

如果用簡單工廠模式實現:

#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()

寫一個雷鋒類,定義買米和掃地兩個方法,寫一個學生類和社區志願者類,繼承雷鋒類,寫一個工廠類,根據輸入的類型返回學生類或志願者類。

用工廠方法模式實現:

#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()

雷鋒類,大學生類,志願者類和簡單工廠一樣,新寫一個工廠方法基類,定義一個工廠方法接口(工廠方法模式的工廠方法應該就是指這個方法),然后寫一個學生工廠類,志願者工廠類,重新工廠方法,返回各自的類。

工廠方法相對於簡單工廠的優點:

1.在簡單工廠中,如果需要新增類,例如加一個中學生類(MiddleStudent),就需要新寫一個類,同時要修改工廠類的map_,加入'中學生':MiddleStudent()。這樣就違背了封閉開放原則中的一個類寫好后,盡量不要修改里面的內容,這個原則。而在工廠方法中,需要增加一個中學生類和一個中學生工廠類(MiddleStudentFactory),雖然比較繁瑣,但是符合封閉開放原則。在工廠方法中,將判斷輸入的類型,返回相應的類這個過程從工廠類中移到了客戶端中實現,所以當需要新增類是,也是要修改代碼的,不過是改客戶端的代碼而不是工廠類的代碼。

2.對代碼的修改會更加方便。例如在客戶端中,需要將Student的實現改為Volunteer,如果在簡單工廠中,就需要把

leifeng1 = LeiFengFactory().create_lei_feng('大學生')

中的大學生改成社區志願者,這里就需要改三處地方,但是在工廠方法中,只需要吧

myFactory = StudentFactory()

改成

myFactory = VolunteerFactory()

就可以了

 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM