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

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

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

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

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

类图中的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. 使用Flask+uwsgi+Nginx部署Flask正式环境

    环境准备 在开始正式讲解之前,我们将首先进行环境准备. Step1:安装Python,pip以及nginx: sudo apt-get update sudo apt-get install pyth ...

  2. C++获取系统信息(IP地址、硬件信息等)

    #include<stdio.h> #include<winsock2.h> //该头文件需在windows.h之前 #include<windows.h> #in ...

  3. Code Chef MINPOLY(计算几何+dp)

    题面 传送门 题解 我们枚举这个凸多边形\(y\)坐标最小的点\(p_i\),然后对于所有\(y\)坐标大于等于它的点极角排序 我们预处理出\(s_{j,k}\)表示三角形\(p_i,p_j,p_k\ ...

  4. Linux下查看文档指令

    1,cat直接查看 cat /etc/profile 2,more,less分页查看 less  /etc/profile more /etc/profile less -N /etc/profile ...

  5. 同一域名基于源ip地址分配给不同ip的dns配置--bind9.8.2

    1.安装bind.略. 2./etc/named.conf配置文件. // named.conf // // Provided by Red Hat bind package to configure ...

  6. @JsonInclude、@JsonFormat、@DateTimeFormat注解的使用

    @JsonInclude(value=Include.NON_NULL) :用在实体类的方法类的头上  作用是实体类的参数查询到的为null的不显示 @DateTimeFormat:用于接收 前端传的 ...

  7. [JavaScript] js实现保存文件到本地

    function fake_click(obj) { var ev = document.createEvent("MouseEvents"); ev.initMouseEvent ...

  8. Eleasticsearch启动失败问题解决

    问题: [root@dnode1 bin]# ./elasticsearch -d [root@dnode1 bin]# Exception in thread "main" ja ...

  9. 使用Express构建RESTful API

    RESTful服务 REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的 ...

  10. ubuntu升级pip后, ImportError: cannot import name ‘main‘

    场景描述: 原先pip安装完成之后,一直没有更新版本,原pip版本为8.1.1,今天安装python 包pysftp的时候,提示需要升级pip到(pip 10.0.1); 于是乎,直接手到擒来,终端命 ...