【此是锻炼神冰铁,磨琢成工光皎洁。老君自己动钤锤,荧惑亲身添炭屑。五方五帝用心机,六丁六甲费周折。造成九齿玉垂牙,铸就双环金坠叶。身妆六曜排五星,体按四时依八节。短长上下定乾坤,左右阴阳分日月。六爻神将按天条,八卦星辰依斗列。名为上宝逊金钯,进与玉皇镇丹阙。】

在西游记第十九回【云栈洞悟空收八戒 浮屠山玄奘受心经】中,猪八戒自述了九齿钉耙的来历。

建造者模式主要用于将对象的复杂构造过程与调用者隔离开来,使得客户端不用关心产品的内部结构和构造过程,直接获取最终的产品即可。

西游记中有很多神兵神器,这些神器都有自己独立的打造流程,从上面九齿钉耙的描述来看,大致需要【取材】、【琢磨】、【锤炼】、【铸型】、【装饰】及【命名】六个步骤,但这些事情是太上老君、五方五帝、六丁六甲需要操心的,我们的天蓬元帅肯定懒得知道,这就符合建造者模式的设计结构,即猪八戒【客户端】只负责通过调用太上老君【建造者】来获取九齿钉耙【产品】,九齿钉耙【产品】的建造流程有一定的规则与次序,这些规则与次序由太上老君【建造者】负责处理。

所以建造者模式下九齿钉耙的建造类图如下:

类图中的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-建造者模式的更多相关文章

  1. 今儿直白的用盖房子为例,给你讲讲Java建造者模式

    摘要:建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 本 ...

  2. 2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用

    今天白天主要看了boost库的应用,主要是经常使用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模 ...

  3. 【设计模式】 模式PK:工厂模式VS建造者模式

    1.概述 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象.我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方 ...

  4. 【设计模式】 模式PK:抽象工厂模式VS建造者模式

    1.概述 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可.而建造者模式则是要求按 ...

  5. Java设计模式(5)——创建型模式之建造者模式(Builder)

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图   主要角色 抽象建造者(Builder)——规范建造方法与结果 ...

  6. Java 建造者模式 简单的理解

    建造者模式 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,使用多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表 ...

  7. java 建造者模式

    package de.bvb.test3; /** * 建造者模式: 假如一个类有4个字段,每个字段或者每几个字段的组合都需要设置为构造函数,构造函数就比较麻烦 * 而且如果再加一个字段进去也不好拓展 ...

  8. Java建造者模式

    建造者模式 建造者模式适用场景: 建造一个复杂的对象适用,将构建对象的过程分开,每个类单独构造对象的一部分,最后组装起来,返回我们需要的对象. 下面的例子主要讲解构造一个飞船 Demo: //要获得的 ...

  9. java模式:建造者模式

    我发现很多源码很喜欢用这个模式,比如spring cloud,spring framework. 建造者模式(Builder)用以构建各种各样的对象,主要功能就是代替对象的构造函数,更加自由化. 举个 ...

  10. Java建造者模式(思维导图)

    图1 建造者模式[点击查看大图] 基本的知识点已在思维导图中,下面是demo 1,Builder 为创建一个产品对象的各个部件指定抽象接口 public interface PersonBuilder ...

随机推荐

  1. 网页登入验证码的实现(java&html)

    前端界面实现(由于验证码是动态获取所以用jsp格式) <%@ page language="java" contentType="text/html; charse ...

  2. vscode卡死问题

    网上有人说是和淘宝镜像冲突,也不知啥原因,接下来一下操作会好点: 文件->首选项->设置,搜索search.followSymlinks,把对勾去掉就行 1.修复vs code 造成 rg ...

  3. js判断是否手机自动跳转移动端

    写法一: {literal} <script> //判断是否手机自动跳转 var browser={versions:function(){var u=navigator.userAgen ...

  4. LOJ#3093. 「BJOI2019」光线(递推+概率期望)

    题面 传送门 题解 把\(a_i\)和\(b_i\)都变成小数的形式,记\(f_i\)表示\(1\)单位的光打到第\(i\)个玻璃上,能从第\(n\)个玻璃下面出来的光有多少,记\(g_i\)表示能从 ...

  5. python 数据类型三 (字典)

    一.字典的介绍 字典(dict)是python中唯一的一个映射类型,它是以{}括起来的键值对组成,在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存 ...

  6. 【liferay】5、使用PortletURL进行跨portlet通信 liferay6.2

    [问题] 1.当我们一个页面存在多一个portlet的时候,如在不同的portlet之间传参? [解决办法] 1.在liferay官方有几种方式,比较复杂麻烦,不是太实用,这里不再赘述. 2.通过fr ...

  7. Vue2.5开发去哪儿网App 第四章笔记 下

    1.解决非父子组件之间的传值问题 非父子组件传值(Bus/总线/发布订阅模式/观察者模式) 给 Vue类上挂在一个属性,然后创建vue实例时,实例就拥有了这个属性 Vue.prototype.bus ...

  8. 03-02 Java键盘录入

    键盘录入基本格式: /* 为了让程序的数据更符合开发的数据,我们就加入了键盘录入. 让程序更灵活一下. 那么,我们如何实现键盘数据的录入呢? A:导包 格式: import java.util.Sca ...

  9. 数据库设计 Step by Step (2)——数据库生命周期

    引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整 ...

  10. 图片按日期分类和查看程序(WPF开发)(附源码)

    手机方便了我们的生活,可以随时随地拍摄.越来越多的图片堆砌在电脑里.看到杂乱无章的图片,实在感到头痛.手动整理太复杂.基于此,我写了一个小程序,可以将图片按日期整理和查看.按日期查看图片,回忆过去的点 ...