悟空模式-java-建造者模式
【此是锻炼神冰铁,磨琢成工光皎洁。老君自己动钤锤,荧惑亲身添炭屑。五方五帝用心机,六丁六甲费周折。造成九齿玉垂牙,铸就双环金坠叶。身妆六曜排五星,体按四时依八节。短长上下定乾坤,左右阴阳分日月。六爻神将按天条,八卦星辰依斗列。名为上宝逊金钯,进与玉皇镇丹阙。】
在西游记第十九回【云栈洞悟空收八戒 浮屠山玄奘受心经】中,猪八戒自述了九齿钉耙的来历。
建造者模式主要用于将对象的复杂构造过程与调用者隔离开来,使得客户端不用关心产品的内部结构和构造过程,直接获取最终的产品即可。
西游记中有很多神兵神器,这些神器都有自己独立的打造流程,从上面九齿钉耙的描述来看,大致需要【取材】、【琢磨】、【锤炼】、【铸型】、【装饰】及【命名】六个步骤,但这些事情是太上老君、五方五帝、六丁六甲需要操心的,我们的天蓬元帅肯定懒得知道,这就符合建造者模式的设计结构,即猪八戒【客户端】只负责通过调用太上老君【建造者】来获取九齿钉耙【产品】,九齿钉耙【产品】的建造流程有一定的规则与次序,这些规则与次序由太上老君【建造者】负责处理。
所以建造者模式下九齿钉耙的建造类图如下:

类图中的BaJie就是最终的客户端,Weapon是客户端需要的产品。WeaponBuilder是一个抽象类,他规定了建造者必须实现的接口以及产品的构造逻辑,而具体建造者RakeBuilder则负责了产品各个细节步骤的具体实现。下面我们看一下具体实现代码:
产品:Weapon 武器
package com.tirion.design.builder;
public class Weapon {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
抽象建造者:WeaponBuilder 武器建造者
package com.tirion.design.builder;
public abstract class WeaponBuilder {
public abstract void drawMaterials(Weapon weapon);
public abstract void cut(Weapon weapon);
public abstract void nobbing(Weapon weapon);
public abstract void cast(Weapon weapon);
public abstract void decorate(Weapon weapon);
public abstract void name(Weapon weapon);
public Weapon buildWeapon() {
Weapon weapon = new Weapon();
drawMaterials(weapon);
cut(weapon);
nobbing(weapon);
cast(weapon);
decorate(weapon);
name(weapon);
return weapon;
}
}
具体建造者:RakeBuilder 钉耙建造者
package com.tirion.design.builder;
public class RakeBuilder extends WeaponBuilder {
@Override
public void drawMaterials(Weapon weapon) {
System.out.println("取材-神冰铁");
}
@Override
public void cut(Weapon weapon) {
System.out.println("琢磨-将神冰铁磨得光滑皎洁");
}
@Override
public void nobbing(Weapon weapon) {
System.out.println("锤炼-太上老君亲自锤炼");
}
@Override
public void cast(Weapon weapon) {
System.out.println("铸型-打造成九齿钉耙的模样");
}
@Override
public void decorate(Weapon weapon) {
System.out.println("装饰-在耙身上装饰五星六曜");
}
@Override
public void name(Weapon weapon) {
weapon.setName("上宝逊金钯");
}
}
客户端:BaJie 八戒
package com.tirion.design.builder;
public class BaJie {
public static void main(String[] args) {
WeaponBuilder weaponBuilder = new RakeBuilder();
Weapon weapon = weaponBuilder.buildWeapon();
System.out.println(weapon.getName());
}
}
下面我们执行以下八戒类的main方法,得到的结果如下:
取材-神冰铁
琢磨-将神冰铁磨得光滑皎洁
锤炼-太上老君亲自锤炼
铸型-打造成九齿钉耙的模样
装饰-在耙身上装饰五星六曜
上宝逊金钯
通过上面的示例,我们可以看到九齿钉耙的锻造过程对于使用者八戒来说,是完全透明的,八戒只需要调用钉耙建造者的buildWeapon()方法就可以打造一把九齿钉耙。
如果要修改九齿钉耙的建造细节,比如给九齿钉耙换个名字,就只需要修改钉耙建造者RakeBuilder的命名name()方法即可。
如果要建造新的兵器,比如打造一根金刚镯,那么就新增一个金刚镯建造者,继承抽象建造者WeaponBuilder并实现其抽象方法即可。
如果要更改兵器的构造顺序,比如先命名,再装饰,就只需要调整一下抽象建造者WeaponBuilder的buildWeapon()方法,调整一下建造产品的操作顺序即可。
如果要增加新的建造武器的步骤,比如给武器赋予神力,那么就需要在抽象建造者类中增加一个新的抽象方法,再修改建造方法的逻辑(将新的抽象方法加入进去),并要求所有继承抽象建造者类的具体建造者都实现新的抽象方法。
所以,综上所述,建造者模式适合产品的构建步骤基本确定,未来主要的扩展方向在于添加新的产品,或者变更某个产品的某个构建步骤具体实现的业务情景,不适合产品构建步骤尚未确定,需要经常改变的情形。
关于建造者模式的介绍就到这里,你可以将它记忆为神器打造模式。
如果你认为文章中哪里有错误或者不足的地方,欢迎在评论区指出,也希望这篇文章对你学习java设计模式能够有所帮助。转载请注明,谢谢。
更多设计模式的介绍请到悟空模式-java设计模式中查看。
悟空模式-java-建造者模式的更多相关文章
- 今儿直白的用盖房子为例,给你讲讲Java建造者模式
摘要:建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 本 ...
- 2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用
今天白天主要看了boost库的应用,主要是经常使用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模 ...
- 【设计模式】 模式PK:工厂模式VS建造者模式
1.概述 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象.我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方 ...
- 【设计模式】 模式PK:抽象工厂模式VS建造者模式
1.概述 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可.而建造者模式则是要求按 ...
- Java设计模式(5)——创建型模式之建造者模式(Builder)
一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图 主要角色 抽象建造者(Builder)——规范建造方法与结果 ...
- Java 建造者模式 简单的理解
建造者模式 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,使用多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表 ...
- java 建造者模式
package de.bvb.test3; /** * 建造者模式: 假如一个类有4个字段,每个字段或者每几个字段的组合都需要设置为构造函数,构造函数就比较麻烦 * 而且如果再加一个字段进去也不好拓展 ...
- Java建造者模式
建造者模式 建造者模式适用场景: 建造一个复杂的对象适用,将构建对象的过程分开,每个类单独构造对象的一部分,最后组装起来,返回我们需要的对象. 下面的例子主要讲解构造一个飞船 Demo: //要获得的 ...
- java模式:建造者模式
我发现很多源码很喜欢用这个模式,比如spring cloud,spring framework. 建造者模式(Builder)用以构建各种各样的对象,主要功能就是代替对象的构造函数,更加自由化. 举个 ...
- Java建造者模式(思维导图)
图1 建造者模式[点击查看大图] 基本的知识点已在思维导图中,下面是demo 1,Builder 为创建一个产品对象的各个部件指定抽象接口 public interface PersonBuilder ...
随机推荐
- 使用Flask+uwsgi+Nginx部署Flask正式环境
环境准备 在开始正式讲解之前,我们将首先进行环境准备. Step1:安装Python,pip以及nginx: sudo apt-get update sudo apt-get install pyth ...
- C++获取系统信息(IP地址、硬件信息等)
#include<stdio.h> #include<winsock2.h> //该头文件需在windows.h之前 #include<windows.h> #in ...
- Code Chef MINPOLY(计算几何+dp)
题面 传送门 题解 我们枚举这个凸多边形\(y\)坐标最小的点\(p_i\),然后对于所有\(y\)坐标大于等于它的点极角排序 我们预处理出\(s_{j,k}\)表示三角形\(p_i,p_j,p_k\ ...
- Linux下查看文档指令
1,cat直接查看 cat /etc/profile 2,more,less分页查看 less /etc/profile more /etc/profile less -N /etc/profile ...
- 同一域名基于源ip地址分配给不同ip的dns配置--bind9.8.2
1.安装bind.略. 2./etc/named.conf配置文件. // named.conf // // Provided by Red Hat bind package to configure ...
- @JsonInclude、@JsonFormat、@DateTimeFormat注解的使用
@JsonInclude(value=Include.NON_NULL) :用在实体类的方法类的头上 作用是实体类的参数查询到的为null的不显示 @DateTimeFormat:用于接收 前端传的 ...
- [JavaScript] js实现保存文件到本地
function fake_click(obj) { var ev = document.createEvent("MouseEvents"); ev.initMouseEvent ...
- Eleasticsearch启动失败问题解决
问题: [root@dnode1 bin]# ./elasticsearch -d [root@dnode1 bin]# Exception in thread "main" ja ...
- 使用Express构建RESTful API
RESTful服务 REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的 ...
- ubuntu升级pip后, ImportError: cannot import name ‘main‘
场景描述: 原先pip安装完成之后,一直没有更新版本,原pip版本为8.1.1,今天安装python 包pysftp的时候,提示需要升级pip到(pip 10.0.1); 于是乎,直接手到擒来,终端命 ...