设计模式:工厂方法模式
设计模式:工厂方法模式
定义
工厂方法模式(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'>]