1. 程式人生 > 實用技巧 >Asp.Net Core WebApi入門

Asp.Net Core WebApi入門

設計模式:工廠方法模式


定義

工廠方法模式(Factory Method Pattern)又稱為工廠模式,又稱工廠模式、多型工廠模式和虛擬構造器模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責定義建立產品物件的公共介面,而工廠子類則負責生成具體的產品物件,這樣做的目的是將產品類的例項化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該例項化哪一個具體產品類。

UML結構圖


定義介面類Creator,繼承該類必須實現factoryMethod方法。
ConcreteCreator類繼承Creator,根據具體業務邏輯來實現factoryMethod方法。因此,工廠方法定義了一個介面來建立物件,但具體例項化哪個類則由它的子類決定。

使用場景

一家線上教育公司擁有一款備考四六級學習產品,叫做“四六級訓練營”,上線後廣受四六級備考生歡迎,強烈要求推出考研英語的學習產品,比如叫“考研訓練營”。於是相關專案組開始籌備考研訓練營的生產。分析來看,四六級訓練營和考研訓練營有許多相似的地方,不同的地方在於給使用者安排的學習課程不一樣。
我們可以定義一個訓練營抽象類,約定作為訓練營應該具備的功能,然後分別開發兩個子類四六級訓練營考研訓練營來實現差異化功能。

from abc import ABCMeta, abstractmethod

class Camp(metaclass=ABCMeta):
    def __init__(self):
        self.lessons = []
        self.notice_board = []
        self.notebook = ""

        self.join_camp()
        self.schedule_lesson()

    @abstractmethod
    def join_camp(self):
        # 加入訓練營
        pass

    @abstractmethod
    def schedule_lesson(self):
        # 安排課程
        pass

    def add_lesson(self, lesson):
        # 安排課程
        self.lessons.append(lesson)
    
    def get_lessons(self):
        return self.lessons
        
    def notice_board(self):
        # 公告欄(釋出資訊、通知)
        pass
    
    def notebook(self):
        # 筆記本
        pass

class CETCamp(Camp):
    def join_camp(self):
        print("歡迎來到四六級訓練營")
    
    def schedule_lesson(self):
        self.add_lesson(CETReadLesson)
        self.add_lesson(CETListenLesson)
        

class NPEECamp(Camp):
    def join_camp(self):
        print("歡迎來到考研訓練營")
    
    def schedule_lesson(self):
        self.add_lesson(NPEEReadLesson)
        self.add_lesson(NPEEWriteLesson)


#
# 定義課程
#

class Lesson(metaclass=ABCMeta):
    @abstractmethod
    def lecture(self):
        # 講課
        pass

    @abstractmethod
    def exercise(self):
        # 練習
        pass

class CETReadLesson(Lesson):
    def lecture(self):
        print("今天我們學習《四六級閱讀考試講解》")
    
    def exercise(self):
        print("請完成《四六級閱讀訓練》")

class CETListenLesson(Lesson):
    def lecture(self):
        print("今天我們學習《四六級聽力考試講解》")
    
    def exercise(self):
        print("請完成《四六級聽力訓練》")
        
class NPEEReadLesson(Lesson):
    def lecture(self):
        print("今天我們學習《考研閱讀考試講解》")
    
    def exercise(self):
        print("請完成《考研閱讀訓練》")

class NPEEWriteLesson(Lesson):
    def lecture(self):
        print("今天我們學習《考研寫作考試講解》")
    
    def exercise(self):
        print("請完成《考研寫作訓練》")




if __name__ == "__main__":
    cet_camp = CETCamp()
    print(cet_camp.get_lessons())

    npee_camp = NPEECamp()
    print(npee_camp.get_lessons())

輸出

歡迎來到四六級訓練營
[<class '__main__.CETReadLesson'>, <class '__main__.CETListenLesson'>]
歡迎來到考研訓練營
[<class '__main__.NPEEReadLesson'>, <class '__main__.NPEEWriteLesson'>]