java设计模式3——建造者模式
java设计模式3——建造者模式
1、建造者模式介绍:
建造者模式属于创建型模式,他提供了一种创建对象得最佳方式
定义:
将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示
主要作用:
- 用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
- 用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂的对象(把内部的建造过程和细节隐藏了起来)
举例:

2、建造者模式角色分析

3、方式一:建造模式的常规用法(有指挥)
3.1、构建抽象的建造者(图纸)
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
/**
- 抽象的建造者
*/
public abstract class Builder {
abstract void buildA(); //地基
abstract void buildB(); //钢筋水泥
abstract void buildC(); //铺电线
abstract void buildD(); //粉刷
//完工:等到产品
abstract Product getProduct();
}
3.2、定义产品(房子)
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
//产品:房子
public class Product {
private String buildA;
private String buildB;
private String buildC;
private String buildD;
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + '\'' +
", buildB='" + buildB + '\'' +
", buildC='" + buildC + '\'' +
", buildD='" + buildD + '\'' +
'}';
}
}
3.3、定义具体的建造者(工人)
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
//具体的建造者
public class Worker extends Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
void buildA() {
product.setBuildA("铺地基");
System.out.println("铺地基");
}
@Override
void buildB() {
product.setBuildB("搭钢筋");
System.out.println("搭钢筋");
}
@Override
void buildC() {
product.setBuildC("铺电线");
System.out.println("铺电线");
}
@Override
void buildD() {
product.setBuildD("粉刷墙壁");
System.out.println("粉刷墙壁");
}
@Override
Product getProduct() {
return product;
}
}
3.4、定义指挥者,指挥工人建造
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
/**
- 指挥:核心,负责指挥构建一个工程,工程如何构建,由他来决定
*/
public class Director {
//指挥工人创建房子
public Product build(Builder builder) {
//创建产品
builder.buildA();
builder.buildB();
builder.buildC();
builder.buildD();
return builder.getProduct();
}
}
3.5、创建测试类,进行建造
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
public class Test {
public static void main(String[] args) {
//指挥
Director director = new Director();
//指挥具体的工人完成创建
Product build = director.build(new Worker());
System.out.println(build.toString());
}
}
结果:
铺地基
搭钢筋
铺电线
粉刷墙壁
Product{buildA='铺地基', buildB='搭钢筋', buildC='铺电线', buildD='粉刷墙壁'}
4、方式二:用户可以自定义套餐和选择默认套餐(没有指挥者)
4.1、定义抽象的建造者
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
/**
- 抽象的建造者
*/
public abstract class Builder {
abstract Builder buildA(String msg); //汉堡
abstract Builder buildB(String msg); //可乐
abstract Builder buildC(String msg); //薯条
abstract Builder buildD(String msg); //甜点
//完工:得到产品
abstract Product getProduct();
}
4.2、定义产品和默认套餐
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
/**
- 套餐
*/
public class Product {
//默认套餐
private String buildA = "汉堡";
private String buildB = "可乐";
private String buildC = "薯条";
private String buildD = "甜点";
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + ''' +
", buildB='" + buildB + ''' +
", buildC='" + buildC + ''' +
", buildD='" + buildD + ''' +
'}';
}
}
4.3、定义具体的建造者(服务员)
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
//具体的建造者
public class Worker extends Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
Builder buildA(String msg) {
product.setBuildA(msg);
return this;
}
@Override
Builder buildB(String msg) {
product.setBuildB(msg);
return this;
}
@Override
Builder buildC(String msg) {
product.setBuildC(msg);
return this;
}
@Override
Builder buildD(String msg) {
product.setBuildD(msg);
return this;
}
@Override
Product getProduct() {
return product;
}
}
4.4、定义顾客,进行点餐
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
public class Test {
public static void main(String[] args) {
//服务员
Worker worker = new Worker();
Product product = worker.getProduct();
System.out.println(product.toString());
//自定义套餐
product = worker.buildA("aaa").buildB("bbb").buildC("cccc").buildD("ddd").getProduct();
System.out.println(product.toString());
}
}
运行结果:
Product{buildA='汉堡', buildB='可乐', buildC='薯条', buildD='甜点'}
Product{buildA='aaa', buildB='bbb', buildC='cccc', buildD='ddd'}
5、优点分析:

6、缺点分析:

7、应用场景:

8、建造者模式与抽象工厂模式的比较

java设计模式3——建造者模式的更多相关文章
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- Java设计模式之三 ----- 建造者模式和原型模式
前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...
- Java设计模式之三建造者模式和原型模式
建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...
- java设计模式之建造者模式
学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...
- java设计模式之四建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
- java设计模式3.建造者模式、原型模式
建造者模式 一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才 ...
- JAVA设计模式总结—建造者模式
建造者模式 模式动机与定义 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...
随机推荐
- 《美国纽约摄影学院摄影教材》PDF教材
下载地址: 美国纽约摄影学院摄影教材(上册).pdf 美国纽约摄影学院摄影教材(下册).pdf 欢迎你到纽约摄影学院来,我们急切地等待着开课,你们也在 跃跃欲试了.那就让我们马上开始吧! 你已 ...
- 从0开发3D引擎(二):准备预备知识
大家好,本文介绍了开发3D引擎需要的预备知识,给出了相关的资源. 上一篇博文 从0开发3D引擎(一):开篇 了解Web 3D Web 3D的历史 目前Web 3D是基于WebGL这个Web端3D AP ...
- 小小知识点(五十一)——6G扬帆起航:拍赫兹通信与健康泛在网络助推6G新应用
转自IEEE科技纵览 https://weibo.com/ttarticle/p/show?id=2309404454066502631625 6G扬帆起航:拍赫兹通信与健康泛在网络助推6G新应用 ...
- Theia APIs——Preferences
上一篇:Theia APIs——命令和快捷键 Preferences Theia有一个preference service,模块可以通过它来获取preference的值,提供默认的preference ...
- codevs 3981 动态最大子段和(线段树)
题目传送门:codevs 3981 动态最大子段和 题目描述 Description 题目还是简单一点好... 有n个数,a[1]到a[n]. 接下来q次查询,每次动态指定两个数l,r,求a[l]到a ...
- python防止字符串转义
部分转自:https://www.cnblogs.com/hellofengying/p/10183057.html 今天再打开文件名时,出现了错误,如下: In []: path='D:\Code\ ...
- mongodb学习(一)——简介和基本操作
简介 MongoDB 是一个基于分布式文件存储的数据库 属于NoSQL数据库,是介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的 旨在为WEB应用提供可扩展的高性 ...
- React Hooks 实现和由来以及解决的问题
与React类组件相比,React函数式组件究竟有何不同? 一般的回答都是: 类组件比函数式组件多了更多的特性,比如 state,那如果有 Hooks 之后呢? 函数组件性能比类组件好,但是在现代浏览 ...
- git与github的简单使用教程
git与github的简单使用教程 一.创建仓库 点击new,进入创建仓库页面 对将要创建的仓库进行一些简单的设置 最后再点击create repository就可以了. 到这我们就创建好了一个仓库. ...
- TypeScript 源码详细解读(4)语法1-语法树
在上一节介绍了标记的解析,就相当于识别了一句话里有哪些词语,接下来就是把这些词语组成完整的句子,即拼装标记为语法树. 树(tree) 树是计算机数据结构里的专业术语.就像一个学校有很多年级,每个年级下 ...