《设计模式的艺术》笔记 - 建造者模式

这篇具有很好参考价值的文章主要介绍了《设计模式的艺术》笔记 - 建造者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

        建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造这模式是一种对象创建型模式。

实现

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Product {

};

class Builder {
public:
    virtual void buildPartA() = 0;
    virtual void buildPartB() = 0;
    virtual void buildPartC() = 0;

    virtual Product *getResult();

protected:
    Product *m_product;
};

class ConcreteBuilder : public Builder {    // 具体建造者,负责产品的具体建造过程
public:
    void buildPartA() override;
    void buildPartB() override;
    void buildPartC() override;
};

class Director {    // 指挥者,负责指挥建造者进行产品建造
public:
    Director(Builder *builder);

    Product *construct();
private:
    Builder *m_builder;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

Product* Builder::getResult() {
    return m_product;
}

void ConcreteBuilder::buildPartA() {
    std::cout << "ConcreteBuilder构建A部分" << std::endl;
}

void ConcreteBuilder::buildPartB() {
    std::cout << "ConcreteBuilder构建B部分" << std::endl;
}

void ConcreteBuilder::buildPartC() {
    std::cout << "ConcreteBuilder构建C部分" << std::endl;
}

Director::Director(Builder *builder) {
    m_builder = builder;
}

Product* Director::construct() {
    if (m_builder) {
        m_builder->buildPartA();
        m_builder->buildPartC();
        m_builder->buildPartB();
        return m_builder->getResult();
    }
    return nullptr;
}

main.cpp

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Builder *builder = new ConcreteBuilder();
    Director *director = new Director(builder);
    Product *product = director->construct();
    delete builder;
    delete director;
    delete product;

    return 0;
}

总结

        优点:

        1. 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

        2. 每个具体建造者都相对独立,而与其他具体建造者无关。因此,可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合开闭原则。

        3. 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

        缺点:

        1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间的差异性很大,例如很多组成部分都不相同,就不适合使用建造者模式,因此其使用范围受到一定的限制。

        2. 如果产品的内部结构复杂且多变,可能会需要定义很多具体建造者类来实现这种变化,这就导致系统变得很庞大,增加系统的理解难度和运行成本。

        适用场景:

        1. 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员变量。

        2. 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

        3. 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。

        4. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

练习

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class VideoPlayer {
public:
    const std::string &getMMode() const;

    void setMMode(const std::string &mMode);

    bool isMIsShowMenu() const;

    void setMIsShowMenu(bool mIsShowMenu);

    bool isMIsPlayList() const;

    void setMIsPlayList(bool mIsPlayList);

    bool isMIsMainWindow() const;

    void setMIsMainWindow(bool mIsMainWindow);

    bool isMIsController() const;

    void setMIsController(bool mIsController);

    bool isMIsCollectList() const;

    void setMIsCollectList(bool mIsCollectList);

    void play();

private:
    std::string m_mode;
    bool m_isShowMenu;
    bool m_isPlayList;
    bool m_isMainWindow;
    bool m_isController;
    bool m_isCollectList;
};

class VideoPlayerBuilder {
public:
    VideoPlayerBuilder();
    ~VideoPlayerBuilder();
    virtual void buildMode() = 0;
    virtual void buildMenu() = 0;
    virtual void buildPlayList() = 0;
    virtual void buildMainWindow() = 0;
    virtual void buildController() = 0;
    virtual void buildCollectList() = 0;

    VideoPlayer *construct();

protected:
    VideoPlayer *m_player;
};

class CompletePlayerBuiler : public VideoPlayerBuilder {
public:
    void buildMode() override;

    void buildMenu() override;

    void buildPlayList() override;

    void buildMainWindow() override;

    void buildController() override;

    void buildCollectList() override;
};

class SimplePlayerBuilder : public VideoPlayerBuilder {
public:
    void buildMode() override;

    void buildMenu() override;

    void buildPlayList() override;

    void buildMainWindow() override;

    void buildController() override;

    void buildCollectList() override;
};

class MemoryPlayerBuilder : public VideoPlayerBuilder {
public:
    void buildMode() override;

    void buildMenu() override;

    void buildPlayList() override;

    void buildMainWindow() override;

    void buildController() override;

    void buildCollectList() override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

const std::string &VideoPlayer::getMMode() const {
    return m_mode;
}

void VideoPlayer::setMMode(const std::string &mMode) {
    m_mode = mMode;
}

bool VideoPlayer::isMIsShowMenu() const {
    return m_isShowMenu;
}

void VideoPlayer::setMIsShowMenu(bool mIsShowMenu) {
    m_isShowMenu = mIsShowMenu;
}

bool VideoPlayer::isMIsPlayList() const {
    return m_isPlayList;
}

void VideoPlayer::setMIsPlayList(bool mIsPlayList) {
    m_isPlayList = mIsPlayList;
}

bool VideoPlayer::isMIsMainWindow() const {
    return m_isMainWindow;
}

void VideoPlayer::setMIsMainWindow(bool mIsMainWindow) {
    m_isMainWindow = mIsMainWindow;
}

bool VideoPlayer::isMIsController() const {
    return m_isController;
}

void VideoPlayer::setMIsController(bool mIsController) {
    m_isController = mIsController;
}

bool VideoPlayer::isMIsCollectList() const {
    return m_isCollectList;
}

void VideoPlayer::setMIsCollectList(bool mIsCollectList) {
    m_isCollectList = mIsCollectList;
}

void VideoPlayer::play() {
    std::cout << "------ " << getMMode() << " ------" << std::endl;
    if (m_isShowMenu) {
        std::cout << "显示菜单" << std::endl;
    }
    if (m_isPlayList) {
        std::cout << "显示播放列表" << std::endl;
    }
    if (m_isMainWindow) {
        std::cout << "显示主窗口" << std::endl;
    }
    if (m_isController) {
        std::cout << "显示控制条" << std::endl;
    }
    if (m_isCollectList) {
        std::cout << "显示收藏列表" << std::endl;
    }
}

VideoPlayerBuilder::VideoPlayerBuilder() {
    m_player = new VideoPlayer();
}

VideoPlayerBuilder::~VideoPlayerBuilder() {
    if (m_player) {
        delete m_player;
    }
}

VideoPlayer* VideoPlayerBuilder::construct() {
    buildMode();
    buildMenu();
    buildPlayList();
    buildMainWindow();
    buildController();
    buildCollectList();
    return m_player;
}

void CompletePlayerBuiler::buildMode() {
    m_player->setMMode("完整模式");
}

void CompletePlayerBuiler::buildMenu() {
    m_player->setMIsShowMenu(true);
}

void CompletePlayerBuiler::buildPlayList() {
    m_player->setMIsPlayList(true);
}

void CompletePlayerBuiler::buildMainWindow() {
    m_player->setMIsMainWindow(true);
}

void CompletePlayerBuiler::buildController() {
    m_player->setMIsController(true);
}

void CompletePlayerBuiler::buildCollectList() {
    m_player->setMIsCollectList(false);
}

void SimplePlayerBuilder::buildMode() {
    m_player->setMMode("精简模式");
}

void SimplePlayerBuilder::buildMenu() {
    m_player->setMIsShowMenu(false);
}

void SimplePlayerBuilder::buildPlayList() {
    m_player->setMIsPlayList(false);
}

void SimplePlayerBuilder::buildMainWindow() {
    m_player->setMIsMainWindow(true);
}

void SimplePlayerBuilder::buildController() {
    m_player->setMIsController(true);
}

void SimplePlayerBuilder::buildCollectList() {
    m_player->setMIsCollectList(false);
}

void MemoryPlayerBuilder::buildMode() {
    m_player->setMMode("记忆模式");
}

void MemoryPlayerBuilder::buildMenu() {
    m_player->setMIsShowMenu(false);
}

void MemoryPlayerBuilder::buildPlayList() {
    m_player->setMIsPlayList(false);
}

void MemoryPlayerBuilder::buildMainWindow() {
    m_player->setMIsMainWindow(true);
}

void MemoryPlayerBuilder::buildController() {
    m_player->setMIsController(true);
}

void MemoryPlayerBuilder::buildCollectList() {
    m_player->setMIsCollectList(true);
}

main.cpp文章来源地址https://www.toymoban.com/news/detail-794943.html

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    VideoPlayerBuilder *builder = new CompletePlayerBuiler();
    VideoPlayer *player = builder->construct();
    player->play();
    delete builder;

    builder = new SimplePlayerBuilder();
    player = builder->construct();
    player->play();
    delete builder;

    builder = new MemoryPlayerBuilder();
    player = builder->construct();
    player->play();
    delete builder;

    return 0;
}

到了这里,关于《设计模式的艺术》笔记 - 建造者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《设计模式的艺术》笔记 - 命令模式

            命令模式将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为模式,其别名为动作模式或事务模式。 myclass.h myclass.cpp main.cpp         只需要增加一个CommandQueue类即可

    2024年01月20日
    浏览(56)
  • 《设计模式的艺术》笔记 - 外观模式

            外观模式中外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 myclass.h myclass.cpp main.cpp    

    2024年01月19日
    浏览(52)
  • 《设计模式的艺术》笔记 - 组合模式

            组合模式组合多个对象形成树形结构以表示具有“部分-整体”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,又可以称为“部分—整体”(Part-Whole)模式,它是一种对象结构型模式。 myclass.h myclass.cpp main.cpp  

    2024年01月19日
    浏览(45)
  • 《设计模式的艺术》笔记 - 装饰模式

            装饰模式动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。  myclass.h myclass.cpp main.cpp         1. 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加

    2024年01月19日
    浏览(51)
  • 《设计模式的艺术》笔记 - 桥接模式

            桥接模式将抽象部分与其实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式 myclass.h myclass.cpp main.cpp         1. 分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,

    2024年01月18日
    浏览(56)
  • 《设计模式的艺术》笔记 - 抽象工厂模式

            提供了一个创建一系列相关或相互依赖的对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。         在抽象工厂模式中,每个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族。

    2024年01月16日
    浏览(37)
  • 《设计模式的艺术》笔记 - 单例模式

            单例模式优点是可以确保系统中只存在单个对象实例,缺点是不便扩展,一定程度上违背单一原则,既提供业务方法,又提供创建对象方法         在类加载的时候就创建好对象,获取对象时直接返回即可         在类加载的时候没有创建对象,第一次获取对象

    2024年02月02日
    浏览(44)
  • 《设计模式的艺术》笔记 - 简单工厂模式

            定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式,属于类创建型模式         将Factory合并到父类Product中,此时

    2024年01月16日
    浏览(47)
  • 《设计模式的艺术》笔记 - 工厂方法模式

            在简单工厂模式中,当系统中需要引入新的产品时,由于静态工厂方法通过所传入的参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则。因此,工厂方法模式应运而生。工厂方法模式是定义一个用于创建对象的接口,让子类决定将哪一个

    2024年01月23日
    浏览(46)
  • 《设计模式的艺术》笔记 - 迭代器模式

            迭代器模式提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。 myclass.h myclass.cpp main.cpp         1. 支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代

    2024年01月24日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包