zoukankan      html  css  js  c++  java
  • 设计模式:工厂方法模式

    设计模式:工厂方法模式


    定义

    工厂方法模式(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'>]
    
  • 相关阅读:
    你会做夹具吗?(一)
    DDR3布线设计要点总结
    PCB设计要点-DDR3布局布线技巧及注意事项
    走进JEDEC,解读DDR(下)
    [转]关于STM32 PB3 PB4 如何设置成普通GPIO的配置
    [转]Verilog有符号数与无符号数作运算
    [转]实用光电二极管pd的采样电路
    STM32外部8M晶振不启动
    ALTCLKCTRL核的作用
    [转]如何在Altium Designer中将PCB生成PDF?
  • 原文地址:https://www.cnblogs.com/Zioyi/p/14258840.html
Copyright © 2011-2022 走看看