码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式:工厂方法模式

时间:2021-01-12 11:19:33      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:输出   metaclass   rac   exe   根据   self   用户   决定   在线教育   

设计模式:工厂方法模式


定义

工厂方法模式(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‘>]

设计模式:工厂方法模式

标签:输出   metaclass   rac   exe   根据   self   用户   决定   在线教育   

原文地址:https://www.cnblogs.com/Zioyi/p/14258840.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!