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. MySQL LOAD DATA

    <?php /** * @Author: Awe * @Date: 2016-10-26 17:26:54 * @Last Modified by: Awe * @Last Modified t ...

  2. P5108 仰望半月的夜空 SAM+线段树覆盖

    $ \color{#0066ff}{ 题目描述 }$ 半月的夜空中,寄托了多少人与人之间的思念啊 曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\) 由于思念汇集的过于复杂,因此曦月希望 ...

  3. 使用canvas实现画中画效果的H5

    最近看到一个挺有趣的H5,主要效果就是通过不断的放缩来展示画中画,网上找了一下并没有这方面的实现代码,故决定原创一下,并分享出来 主要的思路就是通过canvas不断的写入图片,考虑到每一层的图片的位置 ...

  4. 01迷宫 BFS

    题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...

  5. vue 数据(data)赋值问题

    总结一下我遇到的一个纠结很久的问题. 在项目中需要用到后台的数据对前端渲染,使用到了vue整合的axios,使用vue中的钩子函数在页面组件挂载完成之后向后台发送一个get请求然后将返回后的数据赋值d ...

  6. 停不下来队 Scrum Meeting 博客汇总

    停不下来队 Scrum Meeting 博客汇总 一.Alpha阶段 [Alpha]Scrum Meeting#1 [Alpha]Scrum Meeting#2 [Alpha]Scrum Meetin ...

  7. Robot Framework的安装、更新与卸载

    Robot Framework的安装.更新与卸载 一,安装RF前的准备 一般就三种执行环境 Python, Jython (JVM) 和 IronPython (.NET): 安装python: #T ...

  8. pycharm安装与使用

    python是一门解释性编程语言,所以一般把写python的工具叫解释器.写python脚本的工具很多,小编这里推荐pycharm,是小编用过最好用的一个工具.比较顺手的一个.而且可以跨平台,在mac ...

  9. Android开发环境搭建步骤-【Android】

    本教程是android开发环境在windows下的安装配置,经本人测试完全正确无误.这个教程是史上最详细的android开发环境搭建教程. 工具/原料 Eclipse 3.7.0.Java Jdk6. ...

  10. springmvc4 相关注解的详细讲解

    首先我是一个初学springmvc,抱着去加深印象的目的去整理相关springmvc4的相关注解,同时也希望给需要相关查阅的读者带来帮助. 1.@ControllerController控制器是通过服 ...