Java设计模式之Builder模式

  • Java设计模式之Builder模式

    • 简介

      • 适用性
    • 用LOL的出装备的顺序为例
      • 基本实现代码

        • BasePerson的实现
        • DeMaXiYa的实现
        • QiTianDaSheng的基本实现
        • client的实现
      • 初步使用Buildr模式
        • BasePerson的改进
        • Builder的实现
        • 两个具体Builder的实现
        • client的改进
    • 完整的Builder模式
      • Director的实现
      • client的改进

简介

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用性

在以下情况使用Build模式:

1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2 当构造过程必须允许被构造的对象有不同的表示时。

3 Builder模式要解决的也正是这样的问题:

  当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),

  我们要复杂对象的创建过程和这个对象的表示(展示)分离开来,

  这样做的好处就是通过一步步的进行复杂对象的构建,

  由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。

用LOL的出装备的顺序为例

lol的uml如下图,人物的四种装备和一个展示装备顺序的show方法,还有client类:

基本实现代码

BasePerson的实现

public abstract class BasePerson {/*** 首先出魔法装备*/protected abstract void magic();/*** 首先出鞋子*/protected abstract void shoe();/*** 首先出攻速装备*/protected abstract void velocity();/*** 首先出物理攻击装备*/protected abstract void strength();/*** 展示出装的顺序*/public abstract void show();
}

DeMaXiYa的实现:

/*** @author HaoTianYi  hao.ty@haotianyi.win* @version v1.0*  表示德玛西亚*/
public class DeMaXiYa extends BasePerson {/*** 首先出魔法装备*/protected void magic() {System.out.println("-----德玛西亚-----魔法装备-----------");}/*** 首先出鞋子*/protected void shoe() {System.out.println("-----德玛西亚-----鞋子-----------");}/*** 首先出攻速装备*/protected void velocity() {System.out.println("------德玛西亚----攻速装备-----------");}/*** 首先出物理攻击装备*/protected void strength() {System.out.println("-----德玛西亚-----物理攻击装备-----------");}/*** 展示出装的顺序*/@Overridepublic void show() {magic();shoe();velocity();strength();}
}

QiTianDaSheng的基本实现

/*** @author HaoTianYi  hao.ty@haotianyi.win* @version v1.0* 表示猴子*/
public class QiTianDaSehng extends BasePerson {/*** 首先出魔法装备*/protected void magic() {System.out.println("----猴子------魔法装备-----------");}/*** 首先出鞋子*/protected void shoe() {System.out.println("----猴子------鞋子-----------");}/*** 首先出攻速装备*/protected void velocity() {System.out.println("----猴子------攻速装备-----------");}/*** 首先出物理攻击装备*/protected void strength() {System.out.println("----猴子------物理攻击装备-----------");}/*** 展示出装的顺序*/@Overridepublic void show() {magic();shoe();velocity();strength();}
}

client的实现:

 public class client {public static void main(String[] args) {DeMaXiYa deMaXiYa = new DeMaXiYa();deMaXiYa.show();QiTianDaSehng qiTianDaSehng = new QiTianDaSehng();qiTianDaSehng.show();}
}

最后的出装备的结果:

初步使用Buildr模式

上面的代码不复杂,但是“将一个复杂对象的构建与它的表示没有分离”,两个任务由构建方法和表示方法,使用Builder将一个复杂对象的构建与它的表示分离。

做到了将一个复杂对象的构建与它的表示分离

BasePerson的改进

public abstract class BasePerson {/*** 首先出魔法装备*/public abstract void magic();/*** 首先出鞋子*/public abstract void shoe();/*** 首先出攻速装备*/public abstract void velocity();/*** 首先出物理攻击装备*/public abstract void strength();
}

Builder的实现

public abstract class Builder {/*** 表示与之对应的英雄*/protected BasePerson mBasePerson;/*** 设置出装的顺序和展示*/public abstract void setOrderAndShow();/*** 获得英雄人物** @return*/public abstract Builder setPerson();
}

两个具体Builder的实现

public class DeMaBuilder extends Builder {/*** 设置出装的顺序和展示*/@Overridepublic void setOrderAndShow() {mBasePerson.magic();mBasePerson.shoe();mBasePerson.velocity();mBasePerson.strength();}/*** 获得英雄人物** @return*/@Overridepublic Builder setPerson() {mBasePerson = new DeMaXiYa();return this;}
}
public class HouZiBuilder extends Builder {/*** 设置出装的顺序和展示*/@Overridepublic void setOrderAndShow() {mBasePerson.magic();mBasePerson.shoe();mBasePerson.velocity();mBasePerson.strength();}/*** 获得英雄人物** @return*/@Overridepublic Builder setPerson() {mBasePerson = new QiTianDaSehng();return this;}
}

除了类名不同,初始化不同其他完全相同

client的改进

public class client {public static void main(String[] args) {DeMaBuilder deMaBuilder = new DeMaBuilder();deMaBuilder.setPerson().setOrderAndShow();HouZiBuilder houZiBuilder = new HouZiBuilder();houZiBuilder.setPerson().setOrderAndShow();}
}

完整的Builder模式

增加导演类,再次包装builder类:

Director的实现

public abstract class Director {protected Builder mBuilder;/*** 调用builder中的方法*/public abstract void construct();
}
public class DeMaDirector extends Director {public DeMaDirector() {mBuilder = new DeMaBuilder();}/*** 调用builder中的方法*/@Overridepublic void construct() {mBuilder.setPerson().setOrderAndShow();}
}
public class HouZiDirector extends Director {public HouZiDirector() {mBuilder = new HouZiBuilder();}/*** 调用builder中的方法*/@Overridepublic void construct() {mBuilder.setPerson().setOrderAndShow();}
}

client的改进

public class client {public static void main(String[] args) {new DeMaDirector().construct();new HouZiDirector().construct();}
}

GitHub连接:GitHub

Java设计模式之Builder模式相关推荐

  1. Java 设计模式之Builder模式

    设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...

  2. java设计模式:Builder模式

    Builder模式关键是在建立对象是一步一步处理 package customer;class Starbucks {private String size;private String drink; ...

  3. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  4. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  5. java设计模式6--适配器模式(Adapter )

    本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址. 适配器模式(别名:包装器) 将一个类的接口转换 ...

  6. java设计模式5--原型模式(Prototype)

    本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...

  7. Java设计模式分为创建模式, 结构模式, 行为模式 3种类型

    Java设计模式之创建模式包括: Factory,    工厂模式 Singleton,   单例模式 Builder,    建造模式 Prototype,    原型模式 Java设计模式之结构模 ...

  8. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  9. java设计模式之建造者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

最新文章

  1. 10 个 Python 工程师,9 个不合格!
  2. 强化学习与深度,神经网络的结合随记
  3. 搜狐2012.9.15校园招聘会笔试题
  4. learnpythonthehardway下载_LearnPythonTheHardWay学习笔记1:学习环境搭建
  5. java交换数组元素_交换数组中的元素(Java)
  6. 微信小程序图片自适应大小(炒鸡详细)
  7. 基于matlab的谐波处理及无功功率补偿源码,谐波抑制和无功功率补偿(第3版) pdf epub mobi txt 下载...
  8. matlab中几种取整函数的用法(fix, floor, ceil, round)
  9. 基于大数据的一线城市住房租赁影响因素分析
  10. 苹果奖学金获得者:我的自学 iOS 开发历程
  11. svn is already locked如何解决
  12. 下载神器aria2和他的客户端Persepolis
  13. 【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享
  14. 网站制作教程:新手如何用PageAdmin建站系统做网站
  15. Linux脚本的制作命令
  16. AP AUTOSAR 6——Execution Management
  17. pyqt5登录界面设计——模仿qq登录界面,可登录注册(数据库)
  18. 天才如周杰伦与周星驰也难逃孤独
  19. 【蓝桥杯】九宫重排(BFS+康拓展开)
  20. 关于for each

热门文章

  1. 将个人微信公众号变成查券返利机器人完美教程分享
  2. 做到这些,你就读懂人生了
  3. linux tar 压缩 删除源文件,Linux tar 如何在压缩之后删除原文件
  4. css只设置背景图片半透明,css3实现背景图片半透明内容不透明的方法示例
  5. 【转】BCWS、BCWP、ACWP的理解
  6. 20220827 360笔试
  7. python 安装 pyinstaller 报错Preparing wheel metadata ... error
  8. 使用开源软件Prometheus监控企业内部应用
  9. 【体系结构】有关Oracle SCN知识点的整理--补充内容
  10. hdoj 4288coder cf 85d Sum of Medians