//以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码

//Product.h

#pragma once
class Product {
public:
Product();
~Product();
void ProducePart();
protected:
private:
}; class ProductPart {
public:
ProductPart();
~ProductPart();
ProductPart* buildPart();
protected:
private: };

//Product.cpp

#include"Product.h"
#include<iostream> Product::Product()
{
ProducePart();
std::cout << "return a Product." << std::endl;
}
Product::~Product()
{ }
void Product::ProducePart()
{
std::cout << "Build part of product." << std::endl;
} ProductPart::ProductPart(){}
ProductPart::~ProductPart(){}
ProductPart* ProductPart::buildPart()
{
return new ProductPart;
}

//Build.h

#pragma once
#include<string>
class Product;
class Builder {
public:
virtual ~Builder();
virtual void BuildPartA(const std::string& buildPara) = ;
virtual void BuildPartB(const std::string& buildPara) = ;
virtual void BuildPartC(const std::string& buildPara) = ;
virtual Product* getProduct() = ;
protected:
Builder();
private:
}; class ConcreateBuilder :public Builder {
public:
ConcreateBuilder();
virtual ~ConcreateBuilder();
void BuildPartA(const std::string& buildPara);
void BuildPartB(const std::string& buildPara);
void BuildPartC(const std::string& buildPara);
Product* getProduct();
protected:
private:
};

//Build.cpp

#include"Build.h"
#include"Product.h"
#include<iostream> Builder::Builder(){}
Builder::~Builder(){}
ConcreateBuilder::ConcreateBuilder(){}
ConcreateBuilder::~ConcreateBuilder(){}
void ConcreateBuilder::BuildPartA(const std::string& buildPara)
{
std::cout << "Step1: Build Part1...." << buildPara << std::endl;
}
void ConcreateBuilder::BuildPartB(const std::string& buildPara)
{
std::cout << "Step2: Build Part2..." << buildPara << std::endl;
}
void ConcreateBuilder::BuildPartC(const std::string& buildPara)
{
std::cout << "Step3: Build Part3..." << buildPara << std::endl;
}
Product* ConcreateBuilder::getProduct()
{
BuildPartA("Pre-Defined");
BuildPartB("Pre-Defined");
BuildPartC("Pre-Defined");
return new Product();
}

//Director.h

#pragma once
class Builder;
class Director {
public:
~Director();
Director(Builder* bld);
void Construct();
protected:
private:
Builder* _bld;
};

//Director.cpp

#include"Director.h"
#include"Build.h" Director::~Director()
{ }
Director::Director(Builder* bld)
{
_bld = bld;
}
void Director::Construct()
{
_bld->BuildPartA("User-Defined");
_bld->BuildPartB("User-Defined");
_bld->BuildPartC("User-Defined");
}

//main.cpp

#include"Build.h"
#include"Director.h"
#include"Product.h" int main(int args, char* argv)
{
Director* dir = new Director(new ConcreateBuilder());
dir->Construct(); return ;
}

设计模式-Builder模式(创建型模式)的更多相关文章

  1. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  2. 初探Java设计模式1:创建型模式(工厂,单例等)

    Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...

  3. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  4. Builder生成器(创建型模式)

    一.使用场景: 1.假设要创建一个House设施,该设施的创建由若干个部分组成,而且这若干个部分经常变化. 如果用最直观的设计方式,每一个房屋部分的变化,都将导致整个房屋结构的重新修正,但是这种设计方 ...

  5. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  6. FactoryMethod工厂方法模式(创建型模式)

    1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...

  7. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  8. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  9. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

    创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...

  10. 设计模式(五):PROTOTYPE原型模式 -- 创建型模式

    1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...

随机推荐

  1. IDEA的@Override下面有红色波浪线怎么去掉

    测试了 , 不会影响运行 ! 去掉红线 ! file - seting - java compiler - 把两个version都改成1.8  !  (  因为我的jdk是1.8) file - pr ...

  2. js a 标签 通过download 实现下载功能

    download 属性规定被下载的超链接目标. 在 <a> 标签中必须设置 href 属性. 该属性也可以设置一个值来规定下载文件的名称.所允许的值没有限制,浏览器将自动检测正确的文件扩展 ...

  3. golang数据结构之插入排序

    //InsertSort 插入排序 func InsertSort(arr *[]int) { ; i < len(arr); i++ { insertVal := (*arr)[i] inse ...

  4. Centos7 下cobbler安装及配置

    1.背景介绍 作为运维,在公司经常遇到一些机械性重复工作要做,例如:为新机器装系统,一台两台机器装系统,可以用光盘.U盘等介质安装,1小时也完成了,但是如果有成百台的服务器还要用光盘.U盘去安装,就显 ...

  5. 【Linux】Linux 性能瓶颈阈值分析

    Linux系统资源包括:CPU.IO(磁盘和网络).内存等 利用率达到三个阶段时: 1)50% 引起注意 2)70% 密切关注 3)90% 严重情况 vmstat.sar.iostat.mpstat. ...

  6. 【前端知识体系-NodeJS相关】对于EventLoop(事件轮询)机制你到底了解多少?

    EventLoop 1. EventLoop的执行流程图 ┌───────────────────────┐ ┌─>│ timers │<----- 执行 setTimeout().set ...

  7. Do Deep Nets Really Need to be Deep?

    url: https://arxiv.org/pdf/1312.6184.pdf year: NIPS2014 浅网络学习深网络的函数表示, 训练方法就是使用深网络的 logits(softmax i ...

  8. 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 小詹&有乔木 PS:如有需要Python学习资料的小伙伴可 ...

  9. 初始HTML_二

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...

  10. Chrome保存的HAR文件怎么打开?

    - Chrome保存HAR 在Chrome中,在需要抓包的任意一个浏览器窗口,按F12,点Network页面,即可进入抓包界面,之后的所有网页交互操作产生的报文,都会在此列出. 在抓包的报文界面上右键 ...