注:图片来源于 https://www.cnblogs.com/-saligia-/p/10216752.html

建造模式UML图解析:

代码:

Director.h

//
// Created by DELL on 2019/10/15.
// #ifndef BUILDER_DIRECTOR_H
#define BUILDER_DIRECTOR_H #include "Builder.h"
class Director {
public:
explicit Director(PhoneBuilder* pb) {
builder = pb;
}
void BuildPlan() {
builder->BuildOS();
builder->BuildShape();
builder->BuildMemory();
builder->ShowDetail();
}
private:
PhoneBuilder* builder;
}; #endif //BUILDER_DIRECTOR_H

Builder.h

//
// Created by DELL on 2019/10/15.
// #ifndef BUILDER_BUILDER_H
#define BUILDER_BUILDER_H #include "Product.h"
class PhoneBuilder {
public:
virtual void BuildOS() = ;
virtual void BuildShape() = ;
virtual void BuildMemory() = ;
virtual void ShowDetail() = ;
}; class HUAWEIBuilder : public PhoneBuilder {
public:
HUAWEIBuilder() {
phone = new Phone();
}
void BuildOS() override {
phone->SetOS("HMOS");
}
void BuildShape() override {
phone->SetShape("6.2inch");
}
void BuildMemory() override {
phone->SetMemory("8G");
}
void ShowDetail() override {
phone->showDetail();
}
private:
Phone* phone;
}; class OPPOBuilder : public PhoneBuilder {
public:
OPPOBuilder() {
phone = new Phone();
}
void BuildOS() override {
phone->SetOS("ColorOS");
}
void BuildShape() override {
phone->SetShape("6.5inch");
}
void BuildMemory() override {
phone->SetMemory("6G");
}
void ShowDetail() override {
phone->showDetail();
}
private:
Phone* phone;
};
#endif //BUILDER_BUILDER_H

Product.h

//
// Created by DELL on 2019/10/15.
// #ifndef BUILDER_PRODUCT_H
#define BUILDER_PRODUCT_H #include <string>
#include <utility>
#include <iostream>
//产品类-手机
class Phone {
public:
Phone() : phone_os("Android"), phone_shape("5 inch"), phone_memory("4G"){}
//set成员函数用于设置private成员变量
void SetOS(std::string os) {
phone_os = std::move(os);
}
void SetShape(std::string shape) {
phone_shape = std::move(shape);
}
void SetMemory(std::string memory) {
phone_memory = std::move(memory);
}
void showDetail() {
std::cout << phone_os << " " << phone_shape << " " << phone_memory << std::endl;
} private:
std::string phone_os;
std::string phone_shape;
std::string phone_memory;
}; #endif //BUILDER_PRODUCT_H

用户 main.cpp

#include <iostream>
#include "Director.h"
#include "Builder.h"
using namespace std; int main() {
PhoneBuilder* hw = new HUAWEIBuilder();
auto* dr1 = new Director(hw);
dr1->BuildPlan(); PhoneBuilder* op = new OPPOBuilder();
auto* dr2 = new Director(op);
dr2->BuildPlan(); return ;
}

注:工厂模式与建造模式最大区别在于:工厂模式关注如何获取实例对象,而建造模式关注如何建造实例对象。

工厂模式直接产出产品,不关注细节,而建造模式关注的是产品的细节,关心如何构造产品的每个细节进而组合成完整产品。

以上是两种模式的区别。

3.建造模式(Builder)的更多相关文章

  1. 建造模式Builder

    建造模式Builder /** * 抽象建造者 */ public abstract class Builder { public abstract void buildPart1(); public ...

  2. 《JAVA设计模式》之建造模式(Builder)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation ...

  3. 【java设计模式】【创建模式Creational Pattern】建造模式Builder Pattern

    package com.tn.pattern; public class Client { public static void main(String[] args) { Director dire ...

  4. 浅谈设计模式--建造器模式(Builder Pattern)

    建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...

  5. 设计模式(5)--Builder(建造模式)--创建型

    1.模式定义: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品 ...

  6. Java建造(Builder)模式

    一.什么是建造模式: 建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而使一个建造过程生成具有不同内部表象的产品.客户端不需要知道产品内部的结构和生产过程. 二.建造模式的结构: Buil ...

  7. 设计模式之——Builder建造模式

    Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式. 示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目. Builder抽象类,为建造模式的核心 ...

  8. 23种设计模式--建造者模式-Builder Pattern

    一.建造模式的介绍       建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...

  9. 六个创建模式之建造者模式(Builder Pattern)

    定义: 将一个复杂的对象的构建与它的表示分类,使得同样的构建过程可以创建不同的表示.建造者模式一步步地创建一个复杂对象,但用户仅需指定对象的类型和内容,不需要关心各个部分之间的关联关系. 结构图: B ...

随机推荐

  1. 刷题记录:[BUUCTF 2018]Online Tool

    目录 刷题记录:[BUUCTF 2018]Online Tool 一.知识点 1.escapeshellarg和escapeshellcmd使用不当导致rce 刷题记录:[BUUCTF 2018]On ...

  2. LeetCode 7. 反转整数(Reverse Integer)

    题目描述 给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 ...

  3. Invalid bound statement (not found) 错误原因

    对我来说,错误的原因是因为没有配置:mybatis.mapperLocations=classpath:mybatis/mapper/*Mapper.xmlmybatis.config-locatio ...

  4. 025_Excel知识汇总

    一.Excel相对引用和绝对应用的区别 加上了绝对地址符“$”的列标和行号为绝对地址,在公式向旁边复制时不会发生变化,没有加上绝对地址符号的列标和行号为相对地址,在公式向旁边复制时会跟着发生变化. 具 ...

  5. AnnotatedElementUtils.findMergedAnnotation作用

    // 在element上查询annotationType类型注解 // 将查询出的多个annotationType类型注解属性合并到查询的第一个注解中 // # 多个相同注解合并 org.spring ...

  6. 关于H5项目开发中TS(或JS)文件按照顺序编译成一个文件的记录

    由于js的执行特性,多个js文件合成一个文件或者进行多个js文件加载时,时需要按照指定的顺序进行的,否则会出现报错的情况. 我们看一下目前几个主流H5引擎的做法. 白鹭的做法 当前版本的做法 在tsc ...

  7. linux centos7 防止暴力破解

    系统 centos 7.4 系统, 不知道的可以用 cat /etc/redhat-release 查看 利用到了linux 系统的日志,每次我们登陆服务器时,如果有登陆认证失败的情况,会在服务器的/ ...

  8. IISExpress.无法启动IIS Express Web 服务器.Starting IIS Express... IIS Express is running

    x 提示: 无法启动IIS Express Web 服务器. 来自IIS Express的输出: Starting IIS Express... IIS Express is running 总结: ...

  9. Kafka在zookeeper中存储结构和查看方式

    Zookeeper 主要用来跟踪Kafka 集群中的节点状态, 以及Kafka Topic, message 等等其他信息. 同时, Kafka 依赖于Zookeeper, 没有Zookeeper 是 ...

  10. python:使用Djangorestframework编写post和get接口

    1.安装django pip install django 2.新建一个django工程 python manage.py startproject cainiao_monitor_api 3.新建一 ...