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. js 的常用方法和对象

    每日分享: 加油!你一定可以!你是最牛逼的!!!-------------------------------------------------------------------------- - ...

  2. [Shell]如何获取Maven工程的project.version信息

    问题: 今天遇到Shell中如何能获取Maven项目工程中的project.version信息的问题 解决方案: 使用Maven的Exec 插件 #! /bin/bash MVN_VERSION=$( ...

  3. python全栈开发_day6_元组,字典,集合

    一:元组    1)定义    元组:有序,可以按索引取值,不可变,但是可以修改元组里面可变数据的数据内容. res = (1,2,3,4,3,2,1) 2)内置方法和使用 res.count(1) ...

  4. zabbix4.2 安装

    官网https://www.zabbix.com/cn/download a. 安装 数据库rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86 ...

  5. 小程序 - 分包加载上限8M(一)

    使用分包 配置方法 假设支持分包的小程序目录结构如下 ├── app.js ├── app.json ├── app.wxss ├── packageA │   └── pages │   ├── c ...

  6. Java - n的阶乘计算

    用递归方法,求10!的阶乘 分析: f(n) = n * f(n-1)           n != 1        -----        递推公式 f(n) = 1               ...

  7. mysql 03

    CREATE TABLE class(    empno INT,    ename VARCHAR(4),    job VARCHAR(4),    mgr INT,    hiredate DA ...

  8. js函数声明提升与变量提升

    变量提升 变量提升: 在指定作用域里,从代码顺序上看是变量先使用后声明,但运行时变量的 “可访问性” 提升到当前作用域的顶部,其值为 undefined ,没有 “可用性”. alert(a); // ...

  9. (转)Uri详解之——Uri结构与代码提取

    前言:依然没有前言…… 相关博客:1.<Uri详解之——Uri结构与代码提取>2.<Uri详解之二——通过自定义Uri外部启动APP与Notification启动> 上几篇给大 ...

  10. Docker搭建tomcat运行环境(修改镜像方式)

    对于java程序员来说,要想使用Docker来部署你的应用,那么在镜像中安装类似于tomcat的容器基本上是必须的(sprintboot项目除外),本篇介绍自己基于对centos镜像的修改,创建自己的 ...