构造器模式,将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

通俗的话来讲,就是把成员变量的初始化与构造函数进行分离。

考虑到当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,有些参数需要she'zhi考虑使用构造者模式。

解决的问题

当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。 例如我们现在有如下一个类计算机类Computer,其中cpu与ram是必填参数,而其他3个是可选参数,那么我们如何构造这个类的实例呢,通常有两种常用的方式:

第一:折叠构造函数模式(telescoping constructor pattern )

class Computer {string cpu;//必须string ram;//必须int usbCount;//可选string keyboard;//可选string display;//可选public:Computer(string cpu, string ram) {this(cpu, ram, 0);}Computer(string cpu, string ram, int usbCount) {this(cpu, ram, usbCount, "罗技键盘");}Computer(string cpu, string ram, int usbCount, string keyboard) {this(cpu, ram, usbCount, keyboard, "三星显示器");}Computer(string cpu, string ram, int usbCount, string keyboard, string display) {this->cpu = cpu;this->ram = ram;this->usbCount = usbCount;this->keyboard = keyboard;this->display = display;}
}

虽然,在C++语言中,可以在形参中赋默认值,但是在其他语言中,上面的表达方式弊端就十分的明显,阅读起来不方便,操作起来也不方便,当构造函数参数超过10个以上时,你在穿参初始化时很容易把值传错给其他的参数。所以builder模式就产生了

一、优化的builder模式:

两个主要的实现思路,将必须初始化的数据设置成构造函数,且构造函数不能太长,将可选的成员变量另外去赋值。

#include "iostream"
using namespace  std;
class Computer {
private:Computer() {}string cpu;//必须string ram;//必须int usbCount;//可选string keyboard;//可选string display;//可选
public:
class Builder{string cpu;//必须string ram;//必须int usbCount;//可选string keyboard;//可选string display;//可选public:Builder(string cup,string ram){this->cpu=cup;this->ram=ram;}const string &getCpu() const {return cpu;}const string &getRam() const {return ram;}int getUsbCount() const {return usbCount;}const string &getKeyboard() const {return keyboard;}const string &getDisplay() const {return display;}Builder& setUsbCount(int usbCount) {this->usbCount = usbCount;return *this;}Builder& setKeyboard(string keyboard) {this->keyboard = keyboard;return *this;}Builder& setDisplay(string display) {this->display = display;return *this;}Computer * build(){return new Computer(*this);}};//省略getter方法Computer(Builder builder){this->cpu=builder.getCpu();this->ram=builder.getRam();this->usbCount=builder.getUsbCount();this->keyboard=builder.getKeyboard();this->display=builder.getDisplay();}};
int main(){Computer * computerPtr =  Computer::Builder("因特尔","三星").setDisplay("三星24寸").setKeyboard("罗技").setUsbCount(2).build();return  0;
}

优化的builder省去了Director角色,而把Builder嵌套在实体类中,充当一个内部类。

二、传统Builder 模式

最原先的builder 模式有一个director类,

1.在builder抽象类中,将实体类Product的可选成员参数的赋值设置为抽象函数,必选成员变量设置为Product实体类和 Builder派生类的构造函数。

2.Procuct 为 Builder派生类 的子对象

3.director 负责初始化  Builder。

1) 定义实体类

public class Computer {private String cpu;//必须private String ram;//必须private int usbCount;//可选private String keyboard;//可选private String display;//可选public Computer(String cpu, String ram) {this.cpu = cpu;this.ram = ram;}public void setUsbCount(int usbCount) {this.usbCount = usbCount;}public void setKeyboard(String keyboard) {this.keyboard = keyboard;}public void setDisplay(String display) {this.display = display;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", ram='" + ram + '\'' +", usbCount=" + usbCount +", keyboard='" + keyboard + '\'' +", display='" + display + '\'' +'}';}
}

2)抽象Builder类 和 派生类

public abstract class ComputerBuilder {public abstract void setUsbCount();public abstract void setKeyboard();public abstract void setDisplay();public abstract Computer getComputer();
}
//苹果电脑构建者
public class MacComputerBuilder extends ComputerBuilder {private Computer computer;public MacComputerBuilder(String cpu, String ram) {computer = new Computer(cpu, ram);}@Overridepublic void setUsbCount() {computer.setUsbCount(2);}@Overridepublic void setKeyboard() {computer.setKeyboard("苹果键盘");}@Overridepublic void setDisplay() {computer.setDisplay("苹果显示器");}@Overridepublic Computer getComputer() {return computer;}
}
//联想电脑构建者类
public class LenovoComputerBuilder extends ComputerBuilder {private Computer computer;public LenovoComputerBuilder(String cpu, String ram) {computer=new Computer(cpu,ram);}@Overridepublic void setUsbCount() {computer.setUsbCount(4);}@Overridepublic void setKeyboard() {computer.setKeyboard("联想键盘");}@Overridepublic void setDisplay() {computer.setDisplay("联想显示器");}@Overridepublic Computer getComputer() {return computer;}
}

3) director  类

public class ComputerDirector {public void makeComputer(ComputerBuilder builder){builder.setUsbCount();builder.setDisplay();builder.setKeyboard();}
}

使用案例:

public static void main(String[] args) {ComputerDirector director=new ComputerDirector();//1ComputerBuilder builder=new MacComputerBuilder("I5处理器","三星125");//2director.makeComputer(builder);//3Computer macComputer=builder.getComputer();//4System.out.println("mac computer:"+macComputer.toString());ComputerBuilder lenovoBuilder=new LenovoComputerBuilder("I7处理器","海力士222");director.makeComputer(lenovoBuilder);Computer lenovoComputer=lenovoBuilder.getComputer();System.out.println("lenovo computer:"+lenovoComputer.toString());
}

设计模式的理解:构造器模式(Builder Pattern)相关推荐

  1. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  2. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. 【设计模式自习室】门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  5. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  6. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  7. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  8. 构造模式(Builder Pattern)

    从简单的对象一步一步构造一个复杂的对象,这就叫做构建模式.它是属于创建设计模式之一,也挺常用的. 适用场合和好处: 仅仅通过指定它的类型和内容来生成一个复杂的对象,而这个构造的对象隐藏在它的构建细节. ...

  9. 大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示

    一句话概括: 使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离. 补充介绍: 建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对 ...

  10. 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

最新文章

  1. ios sqlite3 初级应用
  2. Facebook去年从中国获50亿美元广告收入 占营收10%
  3. C# winform以阅览模式打开PPT,并控制PPT上下页,轮播
  4. VC++实现自定义切换按钮
  5. mysql的基本语句
  6. 加密解密学习--基本概念拾掇
  7. 如何在android上编程,如何在Android中以编程方式与USSD对话框进行交互
  8. 从校园到职场,你对前景很迷茫?
  9. 冬瓜哥详解存储OS变迁
  10. 一个关于IT界牛人的故事,估计是杜撰的。
  11. 【100%通过率】华为OD机试真题 C++ 实现【农场施肥】【2023 Q1 | 100分】
  12. 范里安《微观经济学:现代观点》(第9版)章节习题精编详解
  13. 从零开始学架构——架构基础
  14. git无法推送refs到远端
  15. 笔试面试题目:三点共线的判断
  16. lwm2m和coap协议 简解读
  17. Conway's Law
  18. 数控加工中心导致丝杠振动的原因分析
  19. 解决Nginx报错502之:[error] 17929#17929:57 rewrite or internal redirection cycle while internally redirect
  20. 帮我用php制作一个可以使用的论坛

热门文章

  1. 真是一分钱一分货 NVme SSD都有哪些优势?
  2. hive和hbase区别和联系
  3. access下的分页方案(仿sql存储过程)
  4. 读研打比赛领奖金免费旅游,国内算法竞赛平台了解一下
  5. 【工具分享】deepin v20.5桌面快捷方式编辑器:desktop-entry-editor
  6. hdfs restful API:httpfs与webhdfs的简单使用
  7. Scala Iterator(迭代器)详解
  8. 【收藏】ArcGIS 10.8 for Desktop 完整安装教程(含win7/8/10 32/64位+下载地址+亲测可用+汉化)
  9. postgresql数据库安装以及使用pgadmin连接postgresql数据库
  10. kylin的安装和启动