建造者(生成器)模式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(产品). 生成器模式能帮助构建设计部件与表现的各 ...
随机推荐
- H5新手教程,小白来看看。
H5教程(一) 相信点进来看这篇文章的应该都是刚刚接触H5的新手,那么你真的是找到了一篇合适的文章. 1.学习前准备 既然想学习好H5,只是这样看是不够的,还需要动手练习,以及及时复习,所以我推荐几款 ...
- nginx高性能WEB服务器系列之八--nginx日志分析与切割
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- 「美团 CodeM 复赛」城市网络
题目链接 题意分析 首先 \([u,v]\)在树上是一条深度递增的链 那么我们可以使用倍增找 \(x\)的祖先当中深度最大的值大于\(x\)的点 然后维护一个\(pre\) 重新建树 这样从\(x\) ...
- 游戏2:HTML5制作网页游戏看看你有多色--createjs
效果: index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- image_size must contain 3 elements[4]
今天在制作自己训练集合并且训练的时候,碰见了如下的错: image_size must contain 3 elements[4] 这是因为训练的数据集中不是所有的图片位深都是三通道的. 写一个脚本查 ...
- MongoDB mongo.exe启动及闪退解决 转载
转载自:http://blog.csdn.net/wyx_wx/article/details/76108662 启动: 进入MongoDB安装目录下的bin目录,启动mongod.exe 出现如图所 ...
- JavaWeb学习笔记(二十)—— Ajax
一.Ajax概述 1.1 什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与 ...
- 动态树Link-cut tree(LCT)总结
动态树是个好玩的东西 LCT题集 预备知识 Splay 树链剖分(好像关系并不大) 动态树(Link-cut tree) 先搬dalao博客 什么是LCT? 动态树是一类要求维护森林的连通性的题的总称 ...
- 【python】Scrapy爬虫框架入门
说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...
- 转 zabbix 用户建立和中文化
1. 1 登陆和配置用户 简介 本章你会学习如何登陆Zabbix,以及在Zabbix内建立一个系统用户. 登陆 这是Zabbix的“欢迎”界面.输入用户名 Admin 以及密码 zabbix 以作 ...