悟空模式-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设计模式中查看。