3.建造模式(Builder)
注:图片来源于 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)的更多相关文章
- 建造模式Builder
建造模式Builder /** * 抽象建造者 */ public abstract class Builder { public abstract void buildPart1(); public ...
- 《JAVA设计模式》之建造模式(Builder)
在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation ...
- 【java设计模式】【创建模式Creational Pattern】建造模式Builder Pattern
package com.tn.pattern; public class Client { public static void main(String[] args) { Director dire ...
- 浅谈设计模式--建造器模式(Builder Pattern)
建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...
- 设计模式(5)--Builder(建造模式)--创建型
1.模式定义: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品 ...
- Java建造(Builder)模式
一.什么是建造模式: 建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而使一个建造过程生成具有不同内部表象的产品.客户端不需要知道产品内部的结构和生产过程. 二.建造模式的结构: Buil ...
- 设计模式之——Builder建造模式
Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式. 示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目. Builder抽象类,为建造模式的核心 ...
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- 六个创建模式之建造者模式(Builder Pattern)
定义: 将一个复杂的对象的构建与它的表示分类,使得同样的构建过程可以创建不同的表示.建造者模式一步步地创建一个复杂对象,但用户仅需指定对象的类型和内容,不需要关心各个部分之间的关联关系. 结构图: B ...
随机推荐
- 如何SpringBoot项目改为外置Tomcat启动
正常情况下,我们开发 SpringBoot 项目,由于内置了Tomcat,所以项目可以直接启动,部署到服务器的时候,直接打成 jar 包,就可以运行了 (使用内置 Tomcat 的话,可以在 appl ...
- C#中的断言(Assert)
重构-断言 现象:某一段代码需要对程序状态做出某种假设 做法:以断言明确表现这种假设 动机: 常常有这种一段代码:只有某个条件为真是,该改名才能正常运行. 通常假设这样的假设并没有代码中明确表现出来, ...
- date命令时间戳和时间之间的转换
这里是在mac下的操作,主要就是用date这个命令,更多的用法用man命令查看 字符串格式时间 TO 时间戳我们知道date 命令可以直接把当前时间转化为时间戳 # date +%s143678152 ...
- MySQL count
https://www.jianshu.com/p/1b0a1f641e80] 不同引擎count(*)实现方式不同 MyISAM引擎把一个表的总行数记录在了磁盘上,执行count(*)会直接返回这个 ...
- Python3 多线程(连接池)操作MySQL插入数据
1.主要模块DBUtils : 允许在多线程应用和数据库之间连接的模块套件Threading : 提供多线程功能 2.创建连接池PooledDB 基本参数: mincached : 最少的空闲连接数, ...
- Sword C语言原子操作
/* gcc内置原子操作 */ #include <stdio.h> /* 知识补充: gcc 4.1.2版本之后,对X86或X86_64支持内置原子操作.即不需要引入第三方库(如pthr ...
- 【LeetCode算法-21】Merge Two Sorted Lists
LeetCode第21题 Merge two sorted linked lists and return it as a new list. The new list should be made ...
- 一秒解决CentOS下service 功能 不能使用 bash: service: command not found
首先检查自己是否 使用的是root用户 如果是并且还不能用-----执行以下操作 在centos系统中,如果/sbin目录下没有service这个命令,就会出现 bash: service: comm ...
- express下使用ES6
//环境切换配置 package.json scripts:{ "service": "NODE_ENV=production PORT=3000 npm start&q ...
- [LeetCode] 340. Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
Given a string, find the length of the longest substring T that contains at most k distinct characte ...