Builder 构造器模式[通俗易懂]

Builder 构造器模式[通俗易懂]Builder 构造器模式动机模式定义实例结构要点总结笔记动机在软件系统中,有时候面临着”一个复杂对象“的创建过程,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却通常相对稳定。如何应对这种变化?如何提供一种”封装机制“来隔离出”复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?模式定义将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建出不通的表示(变化)实例构

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

在软件系统中,有时候面临着”一个复杂对象“的创建过程,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却通常相对稳定

如何应对这种变化?如何提供一种”封装机制“来隔离出”复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?

模式定义

将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建出不通的表示(变化)

实例

构建一个房子
朴素

class HouseBuilder{ 
   
public :
    void Init(){ 
   
        this->BuildPart1();
        for(int i = 1;i < 4;i ++){ 
   
            this->BuildPart2();
        }
        bool flag = this->BuildPart3();
        if(flag){ 
   
            this->BuildPart4();
        }
        this->BuildPart5();
    }
    virtual ~HouseBuilder();
protected:
    virtual void BuildPart1() = 0;
    virtual void BuildPart2() = 0;
    virtual void BuildPart3() = 0;
    virtual void BuildPart4() = 0;
    virtual void BuildPart5() = 0;
}

class StoneHouse : public HouseBuilder{ 
   
    protected:
    virtual void BuildPart1() = { 
   

    };
    virtual void BuildPart2() = { 
   
        
    };
    virtual void BuildPart3() = { 
   
        
    };
    virtual void BuildPart4() = { 
   
        
    };
    virtual void BuildPart5() = { 
   
        
    };
}

int main(){ 
   
    House *pHouse = new StoneHouse();
    pHouse->Init()
}

构造器模式

class House{ 
   
    //..
}
class HouseBuilder{ 
   
public :
    House getResult(){ 
   
        return pHouse;
    }
    
    virtual ~HouseBuilder();
protected:

    House *pHouse;
    virtual void BuildPart1() = 0;
    virtual void BuildPart2() = 0;
    virtual void BuildPart3() = 0;
    virtual void BuildPart4() = 0;
    virtual void BuildPart5() = 0;
}

class Stone : public House{ 
   

}
class StoneHouseBuilder : public HouseBuilder{ 
   
    protected:
    virtual void BuildPart1() = { 
   

    };
    virtual void BuildPart2() = { 
   
        
    };
    virtual void BuildPart3() = { 
   
        
    };
    virtual void BuildPart4() = { 
   
        
    };
    virtual void BuildPart5() = { 
   
        
    };
}

class HouseDirector{ 
   
public :
    HouseBuilder *pHouseBuilder;

    HouseDirector(HouseBuilder *pHouseBuilder){ 
   
        this->pHouseBulder = pHouseBuilder;
    }

    House Construct(){ 
   
        pHouseBuilder->BuildPart1();
        for(int i = 1;i < 4;i ++){ 
   
            pHouseBuilder->BuildPart2();
        }
        bool flag = pHouseBuilder->BuildPart3();
        if(flag){ 
   
            pHouseBuilder->BuildPart4();
        }
        pHouseBuilder->BuildPart5();
        return pHouseBuilder->GetResult();
    }
}

结构

在这里插入图片描述

要点总结

  • Builder模式主要用于“分步骤构建一个复杂对象”。在这其中“分步骤”是一个稳定的算法。而复杂对象的各个部分则经常变换。
  • 变化点在哪里,封装在哪里–Builder模式主要是在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动(Construct要求稳定)
  • 在Builder模式中。要注意不同语言中构造器调用虚函数的差别

笔记

  • C++里面构造函数调用自己的虚函数是静态绑定,
  • 一个类的构建过程太复杂 ,则应该重新提取类的代码 改变架构啥的
  • House是表示 HouseBuilder是构建 构建过程是稳定的
  • Builder要求Construct稳定,其缺点在于难以应对“分步骤构建算法”的需求变动(Construct要求稳定)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168508.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 手把手教你如何使用kali破解wifi密码(图文教程)

    手把手教你如何使用kali破解wifi密码(图文教程)如何用kali破解WPA/WPA2加密方式的密码前期准备支持监听的网卡一张以及安装kali的VMwarekali官网kali是什么?——kali就是一个专门用于渗透行业的Linux发行版本,里面的工具非常丰富,本文就是建立在kali系统的支持之上的https://www.kali.org/get-kali/#kali-virtual-machines下载位置下载了vm文件后可以直接用VMware打开,开机后用户名:kali密码:kali正式开始查看已安装网卡airmon-n

    2022年6月5日
    99
  • 文末彩蛋 | 这个 Request URL 长得好不一样

    文末彩蛋 | 这个 Request URL 长得好不一样有朋友拿到一个网站请求的链接问这要怎么解密?很明显这不是加密的数据,这是一张图片base64后的结果,第一次写爬虫朋友遇到这样的请求,可能需要琢磨一下这是什么东西。如…

    2022年10月19日
    0
  • 程序员日记

    程序员日记混迹程序圈yi

    2022年5月25日
    41
  • CreateFileMapping用法

    CreateFileMapping的MSDN翻译和使用心得 测试创建和打开文件映射的时候老是得到”句柄无效”的错误,仔细看了MSDN以后才发觉是函数认识不透,这里把相关的解释翻译出来HANDLECreateFileMapping( HANDLEhFile,                      //物理文件句柄 LPSECURITY_ATTRIBUTESl

    2022年4月6日
    37
  • OpenStack开发_软件架构与应用开发实践报告

    OpenStack开发_软件架构与应用开发实践报告一起研究系列:OpenStack架构分析与实践

    2022年4月21日
    46
  • settings官方网站_phpstorm中文

    settings官方网站_phpstorm中文setting —> php,选择php版本,并点击…,选择到php.exe进入到appserv底下找到php.ini文件,查找date.timezone,去掉前面的;号,添加”Asia/Shanghai”重启appserv环境,就是重启下apache 和 mysql服务发现依然失败后面重启电脑就可以了哈哈哈哈哈哈哈哈…

    2022年8月18日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号