1、建造者模式UML

图1. 建造者模式UML

2、C++实现

  C++实现类视图:

图2. 建造者模式C++实现的类视图

  其中,Product的实现代码是(ProductA和ProductB的代码不再列出):

 //产品抽象基类。
//三个属性的先后赋值顺序代表着不同产品的建立。
class Product
{
private:
std::string attribute1;
std::string attribute2;
std::string attribute3; public:
Product();
~Product();
};

  Builder实现代码是:

 //建造者抽象基类。
class Builder
{
public:
Builder();
~Builder(); //声明的3个为Product的三个属性赋值的函数。
virtual void OperateStep1() = ;
virtual void OperateStep2() = ;
virtual void OperateStep3() = ; //返回建立好的Product对象。
virtual Product * GetResult() = ; };

  ConcreteBuilderA的实现代码是:

 class ConcreteBuilderA :
public Builder
{
private:
ProductA * pa; public:
ConcreteBuilderA() { pa = new ProductA();}
~ConcreteBuilderA(); //函数中是赋值语句,可按具体的产品对象的赋值顺序赋值。
void OperateStep1() { pa->setAttribute1(""); }
void OperateStep2() { pa->setAttribute2(""); }
void OperateStep3() { pa->setAttribute3(""); } //返回建立好的ProductA对象。
Product * GetResult() { return pa; }
};

  ConcreteBuilderB的实现代码是:

 //具体建造者类,建立ProductB的对象,并为ProductB的属性赋值。
class ConcreteBuilderB :
public Builder
{
private:
ProductB * pb; public:
ConcreteBuilderB() { pb = new ProductB(); }
~ConcreteBuilderB(); //函数中是赋值语句,可按具体的产品对象的赋值顺序赋值。
void OperateStep1() { pb->setAttribute3(""); }
void OperateStep2() { pb->setAttribute2(""); }
void OperateStep3() { pb->setAttribute1(""); } //返回建立好的ProductA对象。
Product * GetResult() { return pb; } };

  Director的实现代码是:

 //建造者模式中的监督类。
//向外提供接口,向内定义建造顺序。
class Director
{
private:
Builder * builder; public:
//按得到的不同的对象,进行不同顺序的建造。
Director(Builder &b);
~Director(); //具体的监督方法。
Product * GetResult();
}; Director::Director(Builder &b)
{
builder = &b;
} //方法中的调用顺序固定,建造顺序可在不同的Builder对象设置。
Product * Director::GetResult()
{
builder->OperateStep1();
builder->OperateStep2();
builder->OperateStep3(); return builder->GetResult();
}//end method GetResult

3、Java实现

  Java实现的类视图

图3. 建造者模式的Java实现的类视图

  其中,Product的实现代码是(ProductA和ProductB的代码不再列出):

 public class Product {

     private String attribute1;
private String attribute2;
private String attribute3; }//end class Product

  Builder的实现代码是:

 public abstract class Builder {

     //三个为产品属性赋值的方法。
//三个方法按相应产品必要的顺序赋值。
public abstract void OperateStep1();
public abstract void OperateStep2();
public abstract void OperateStep3(); //一个返回具体产品对象的方法。
public abstract Product GetResult(); }//end class Builder

  ConcreteBuilderA的实现代码是:

 //具体建造者,负责生产ProductA的对象。
public class ConcreteBuilderA extends Builder { private ProductA pa; public ConcreteBuilderA() {
// TODO Auto-generated constructor stub
this.pa = new ProductA();
}//end method ConcreteBuilderA //为产品A中的属性attribute1赋值。
@Override
public void OperateStep1() {
// TODO Auto-generated method stub
this.pa.setAttribute1("这是ProductA的属性attribute1的值:A1"); System.out.println(this.pa.getAttribute1());
}//end method OperateStep1 //为产品A中的属性attribute2赋值。
@Override
public void OperateStep2() {
// TODO Auto-generated method stub
this.pa.setAttribute2("这是ProductA的属性attribute2的值:A2"); System.out.println(this.pa.getAttribute2());
}//end method OperateStep2 //为产品A中的属性attribute3赋值。
@Override
public void OperateStep3() {
// TODO Auto-generated method stub
this.pa.setAttribute3("这是ProductA的属性attribute3的值:A3"); System.out.println(this.pa.getAttribute3());
}//end method OperateStep3 //返回建立好的ProductA的对象。
@Override
public Product GetResult() {
// TODO Auto-generated method stub
return this.pa;
}//end method GetResult }//end class ConcreteBuilderA

  ConcreteBuilderB的实现代码是:

 //具体建造者,负责生产ProductB的对象。
public class ConcreteBuilderB extends Builder { private ProductB pb; public ConcreteBuilderB() {
// TODO Auto-generated constructor stub
this.pb = new ProductB();
}//end method ConcreteBuilderB //为产品B中的属性attribute3赋值。
@Override
public void OperateStep1() {
// TODO Auto-generated method stub
this.pb.setAttribute3("这是ProductB的属性attribute3的值:B1"); System.out.println(this.pb.getAttribute3());
}//end method OperateStep1 //为产品B中的属性attribute2赋值。
@Override
public void OperateStep2() {
// TODO Auto-generated method stub
this.pb.setAttribute2("这是ProductB的属性attribute2的值:B2"); System.out.println(this.pb.getAttribute2());
}//end method OperateStep2 //为产品B中的属性attribute1赋值。
@Override
public void OperateStep3() {
// TODO Auto-generated method stub
this.pb.setAttribute1("这是ProductB的属性attribute1的值:B3"); System.out.println(this.pb.getAttribute1());
}//end method OperateStep3 //返回建立好的ProductB的对象。
@Override
public Product GetResult() {
// TODO Auto-generated method stub
return this.pb;
}//end method GetResult }//end class ConcreteBuilderB

  Director的实现代码是:

 //监督者,负责对外接口,按一定顺序调用Builder中的三个为Product产品属性赋值方法。
public class Director { private Builder builder; public Director(Builder builder) {
// TODO Auto-generated constructor stub
this.builder = builder;
}//end method Director //调用三个赋值方法,并返回建造结果。
public Product GetResult() {
this.builder.OperateStep1();
this.builder.OperateStep2();
this.builder.OperateStep3(); return this.builder.GetResult();
}//end method GetResult }//end method Director

4、点击此处下载源码

建造者(生成器)模式C++、Java实现的更多相关文章

  1. js建造者(生成器)模式

    建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 建造者模式类图: ...

  2. 创建型模式(四) 建造者\生成器模式(Builder)

    一.动机(Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们 ...

  3. Java设计模式之建造者模式(生成器模式)

    建造者模式: 也叫生成器模式.用来隐藏复合对象的创建过程,他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 总结一句就是封装一个对象的构造过程,并允许按步骤构造 ...

  4. Java设计模式-Builder生成器模式

    概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...

  5. Java设计模式:生成器模式

    问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...

  6. 建造者模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) 抽象工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比J ...

  7. 设计模式(4)建造者模式/生成器模式(Builder)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...

  8. Java 设计模式系列(四)生成器模式

    Java 设计模式系列(四)生成器模式 生成器模式也称之为建造者模式.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.demo 1. 生成器模式原理 1.1 生成器模式结构 ...

  9. Java设计模式-建造者(Builder)模式

    目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...

  10. OC编程之道-创建对象之生成器模式

    生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...

随机推荐

  1. [ActionScript 3.0] 十进制与二进制,十六进制等数据之间的相互转换

    将十进制转换为二进制,方法是:将数字除以2,根据余数来从右往左排列二进制的位数,如下以十进制数10为例 10除以2得5,余数为0,故第一个位置为0: 5除以2得2,余数为1,故第二个位置为1: 2除以 ...

  2. python super()继承和多继承

    class A: def __init__(self): self.n = 2 def add(self, m): print('self is {} @A.add'.format(self)) se ...

  3. CF1067D. Computer Game(斜率优化+倍增+矩阵乘法)

    题目链接 https://codeforces.com/contest/1067/problem/D 题解 首先,如果我们获得了一次升级机会,我们一定希望升级 \(b_i \times p_i\) 最 ...

  4. CDQZ Day4

    NOIP 模拟题By liu_runda题目名称 数 论 题源程序文件名 number.cpp theory.cpp problem.cpp输入文件名 number.in theory.in prob ...

  5. System Verilog基础(一)

    学习文本值和基本数据类型的笔记. 1.常量(Literal Value) 1.1.整型常量 例如:8‘b0 32'd0 '0 '1 'x 'z 省略位宽则意味着全位宽都被赋值. 例如: :] sig1 ...

  6. 基于两阶段提交的分布式事务实现(UP-2PC)

    引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...

  7. 关于display:none;和id特性的一些需要注意的地方

    关注点一: display:none;一旦用于某个元素,那个这个元素在页面中就不再占据位置. visibility:hidden;用于某个元素时,这个元素还会占据位置. 关注点二: 即使使用了disp ...

  8. Oracle 数据表的管理

    1.创建表的的表名规则 a.必须已字母开头 b.长度不能超过30 c.不能是Oracle的保留字 d.只能使用如下字符:A-Z.a-z.1-9.#,$等 2.Oracle基本数据类型 2.1 字符型数 ...

  9. jmeter调试脚本之变量参数化

    前言 对于参数化,觉得用得最多的应该是csvread函数.csv data config以及用户自定义变量(前一篇文章已经进行了讲解)控制器这几个 案例:bugfree ,提交bug,参数bug名称和 ...

  10. idea的插件zookeeper

    平时用惯了ZooInspector,偶然知晓了idea的这个插件,试了一下感觉挺方便的 由于开发环境在内网,所以这里介绍内网方式(外网更简单). 1.下载插件 http://plugins.jetbr ...