建造者(生成器)模式C++、Java实现
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
建造者(生成器)模式C++、Java实现的更多相关文章
- js建造者(生成器)模式
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 建造者模式类图: ...
- 创建型模式(四) 建造者\生成器模式(Builder)
一.动机(Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们 ...
- Java设计模式之建造者模式(生成器模式)
建造者模式: 也叫生成器模式.用来隐藏复合对象的创建过程,他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 总结一句就是封装一个对象的构造过程,并允许按步骤构造 ...
- Java设计模式-Builder生成器模式
概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...
- Java设计模式:生成器模式
问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...
- 建造者模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) 抽象工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比J ...
- 设计模式(4)建造者模式/生成器模式(Builder)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...
- Java 设计模式系列(四)生成器模式
Java 设计模式系列(四)生成器模式 生成器模式也称之为建造者模式.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.demo 1. 生成器模式原理 1.1 生成器模式结构 ...
- Java设计模式-建造者(Builder)模式
目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...
- OC编程之道-创建对象之生成器模式
生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...
随机推荐
- 编译图像质量分析库iqa
介绍 iqa库是我在GitHub上偶然发现的一个具有MSE, PSNR, SSIM, MS-SSIM等图像质量分析算法的库,觉得还不错,就把它下载下来编译,编译后生成静态的库.以下是我总结的编译方 ...
- Cache缓存设计
缓存的适用场景: 缓存的目的是提高访问速度,减少不必要的开销,提高性能.那什么样的场景适用于缓存呢.试想一个多项式的计算是一个CPU bound的操作,如果频繁调用同一个多项式的结果.显然缓存结果是一 ...
- Linux sort和uniq命令的应用
sort: 选项: -b 忽略每行前面开始出的空格字符 -c 检查文件是否已经按照顺序排序 -d 排序时,处理英文字母.数字及空格字符外,忽略其他的字符 -f 排序时,将小写字母视为大写字母 -i 排 ...
- React第二篇:组件的生命周期
前言:因为生命周期是必须要掌握的,所以React的第二篇咱就写这. (版本:16.3.2) React的生命周期大致分为四个状态:分别是Mouting.Updating.Unmounting.Erro ...
- 安装Termux的手机上运行Python
1. Termux 终端 Android是一个单用户图形化系统,功能主要以应用的形式呈现给用户,因此在系统上我们无法直接获取终端,更是无法直接调用系统自带的丰富指令.使用ADB是一个曲线救国的方法,打 ...
- 用servlet进行用户名和密码校验01
用servlet进行用户名和密码校验01 编写一个servlet进行用户名和密码校验,获取登录页面的用户名密码,并显示出来 1.工作目录结构 2.首先是一个login.html,包含非常简单的登录表单 ...
- 2.6 Go 读取CSV
Go读取CSV文件,其内容被转换成字符串数组 package main import ( "encoding/csv" "fmt" "io/iouti ...
- vue + typescript 项目起手式
https://segmentfault.com/a/1190000011744210 2017-10-27 发布 vue + typescript 项目起手式 javascript vue.js t ...
- MyBatis整合Spring详细教程
1整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代理 ...
- 10个重要的算法C语言实现源代码
包括拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔 .都是经典的数学算法,希望能开托您的思路.转自kunli.info 1.拉格朗日插值多项式 ,用于离散数 ...