悟空模式-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 ...
随机推荐
- mysql查询语句分析 explain/desc用法
explain或desc显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. explain 数据表 或 desc 数据表 显示数据表各字段含义 ...
- Python黑客——快速编写信息收集器
i春秋作家:大木瓜 环境:Python 3模块:LxmlRequestBeautifulsoup开始:首先看一下目标站: http://gaokao.chsi.com.cn/gkxx/zszcgd/d ...
- Dubbo实现原理之基于SPI思想实现Dubbo内核
dubbo中SPI接口的定义如下: @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public ...
- 利用koa实现mongodb数据库的增删改查
概述 使用koa免不了要操纵数据库,现阶段流行的数据库是mongoDB,所以我研究了一下koa里面mongoDB数据库的增删改查,记录下来,供以后开发时参考,相信对其他人也有用. 源代码请看:我的gi ...
- Redis---List(链表)
1. 基本结构 Redis 早期版本存储 list 列表数据结构使用的是压缩列表 ziplist 和普通的双向链表 linkedlist,也就是元素少时用 ziplist,元素多时用 linkedli ...
- (转)Python3之os模块
原文:https://www.cnblogs.com/wang-yc/p/5623981.html 一:简介 os模块主要用于提供系统高级别的操作. 二:常用方法 1 2 3 4 5 6 7 8 9 ...
- fastjson的JSONArray转化为泛型列表
背景:一个复杂结构体内部可能有array的数据,例如:{name:"test",cities:[{name:"shanghai",area:1,code:200 ...
- 深入理解Spring的异步机制
一.Spring中实现异步执行 在这里我先以事件的机制举例,注意默认情况下事件的发布与监听都是同步执行的.那么我们来看一看基于异步事件的例子该怎么写 首先还是定义事件: package com.bdq ...
- Android学习总结——DrawerLayout 侧滑栏点击事件穿透
使用DrawerLayout实现侧滑栏功能时,点击侧滑栏空白处时,主界面会获得事件. 解决方法:侧滑栏布局添加 android:clickable="true"
- Evenbus简单用法
Evenbus是一个开源插件,可以帮我们在app里面进行数据传递,传递的对象为Object,就是说可以传输任何对象,但是一般为了拓展性和维护性,我们都用来传输Bean类型. 这个插件最重要的是注册和反 ...