设计模式:工厂方法模式

设计模式:工厂方法模式


定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,又称工厂模式、多态工厂模式和虚拟构造器模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

UML结构图

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'>]
posted @ 2021-01-10 17:15  Zioyi  阅读(85)  评论(0编辑  收藏  举报