应用场景

  假设现在我们要设计DNF中的人物角色(鬼剑士、神枪手、魔法师、圣骑士、格斗家)。然而,利用面对对象的思想,必须先从实体入手,每一个角色都包含各种装备、武器、配饰,这些就当做要建造的零件,然后把装备零件组装起来,那么就是最终人物角色的能量值,然后它就将造成不同的伤害。

  回忆过程:假设要创建一个角色,先构建装备零件,控制者控制组装装备零件,构建者得到专属角色。

简述实现

  建造者模式:将一部负责对象的构建分为许多小对象的构建,最后在整合构建的模式。

  建造者模式适用于构造一个很复杂的对象,将其拆分成很多个小对象,方便管理对象。

  

  控制者(Director):控制整个组合过程,通过调用Builder内部的各组件的生成方法进行组装。

  构建者(Builder):构建者接口,定义构建各部件的方法。

  实际构建者(ConcreteBuilder):具体构建出各部件对象,获得构造结构。

  成品(Product):成品类。

  成品类(Car)

  1. public class Car {
  2. //车头
  3. private CarHead carHead;
  4. //车身
  5. private CarBody carBody;
  6. //车轮
  7. private Wheel wheel;
  8. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Car() {}
  9. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Car(CarHead carHead, CarBody carBody, Wheel wheel) {
  10.     </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
  11.     </span><span style="color: #0000ff;">this</span>.carHead =<span style="color: #000000;"> carHead;
  12.     </span><span style="color: #0000ff;">this</span>.carBody =<span style="color: #000000;"> carBody;
  13.     </span><span style="color: #0000ff;">this</span>.wheel =<span style="color: #000000;"> wheel;
  14. }
  15. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run(){
  16.     System.out.println(</span>"车开着 嘟嘟嘟嘟!!!"<span style="color: #000000;">);
  17. }
  18. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CarHead getCarHead() {
  19.     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> carHead;
  20. }
  21. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setCarHead(CarHead carHead) {
  22.     </span><span style="color: #0000ff;">this</span>.carHead =<span style="color: #000000;"> carHead;
  23. }
  24. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CarBody getCarBody() {
  25.     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> carBody;
  26. }
  27. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setCarBody(CarBody carBody) {
  28.     </span><span style="color: #0000ff;">this</span>.carBody =<span style="color: #000000;"> carBody;
  29. }
  30. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Wheel getWheel() {
  31.     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> wheel;
  32. }
  33. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setWheel(Wheel wheel) {
  34.     </span><span style="color: #0000ff;">this</span>.wheel =<span style="color: #000000;"> wheel;
  35. }
  36.  
  37. }

  38. class CarHead{

  39. private String name;

  40. public String getName() {

  41. return name;

  42. }

  43. public void setName(String name) {

  44. this.name = name;

  45. }

  46. }

  47. class CarBody{

  48. private String name;

  49. public void setName(String name) {

  50. this.name = name;

  51. }

  52. public String getName() {

  53. return name;

  54. }

  55. }

  56. class Wheel{

  57. private String name;

  58. public String getName() {

  59. return name;

  60. }

  61. public void setName(String name) {

  62. this.name = name;

  63. }

  64. }

成品类

  抽象构建者(Builder)

  1. public interface Builder {
  2. //构造车头
  3. void builderCarHead();
  4. //构造车身
  5. void builderCarBody();
  6. //构造轮子
  7. void builderWheel();
  8. //得到构建成品
  9. Car getCar();
  10. }

  实际构造者(CarBuilder)

  1. public class CarBuilder implements Builder{
  2. Car car=new Car();
  3. @Override
  4. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> builderCarHead() {
  5.     System.out.println(</span>"构建车头!"<span style="color: #000000;">);
  6.     car.setCarHead(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CarHead());
  7. }
  8. @Override
  9. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> builderCarBody() {
  10.     System.out.println(</span>"构建车身!"<span style="color: #000000;">);
  11.     car.setCarBody(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CarBody());
  12. }
  13. @Override
  14. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> builderWheel() {
  15.     System.out.println(</span>"构建轮子!"<span style="color: #000000;">);
  16.     car.setWheel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Wheel());
  17. }
  18. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Car getCar(){
  19.     </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span><span style="color: #000000;">.car;
  20. }
  21.  
  22. }

  控制者(Director)

  1. public class Director {
  2. private Builder builder;
  3. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Director(Builder builder) {
  4.     System.out.println(</span>"控制车组装"<span style="color: #000000;">);
  5.     </span><span style="color: #0000ff;">this</span>.builder=<span style="color: #000000;">builder;
  6.     builder.builderCarHead();
  7.     builder.builderCarBody();
  8.     builder.builderWheel();
  9. }
  10.  
  11. }

  客户端(Client)

  1. public class Client {
  2. public static void main(String[] args) {
  3. //制造零件
  4. Builder builder=new CarBuilder();
  5. //组装汽车
  6. Director director=new Director(builder);
  7. //获得制造结果
  8. Car car=builder.getCar();
  9. //汽车开始跑
  10. car.run();
  11. }
  12. }

  构建者模式与工厂模式极为相似,建议还是用应用场景去记。而构建者模式相比于工厂模式它多了一个组装过程,而它的应用场景主要是用于构造一个复杂的对象,而工厂模式主要是专注于生产产品或者生产产品系列。当然,他们也可以结合,工厂模式专注于生产产品系列,而构建者模式专注于控制产品的构造流程,从而制造一个复杂的对象。对于设计模式不要拘泥于文字,主要是一种思想在我们运用的时候信手拈来。

版权声明

  作者:邱勇Aaron

  出处:http://www.cnblogs.com/qiuyong/

  您的支持是对博主深入思考总结的最大鼓励。

  本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,尊重作者的劳动成果。

建造者模式—设计角度重温DNF中的角色的更多相关文章

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

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

  2. C++设计模式之建造者模式(三)

    4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...

  3. Java设计模式之建造者模式(Builder Pattern)

    前言 这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点. 一.建造者介绍 ​ 用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现 ...

  4. 我的强迫症系列之@Builder和建造者模式

    前言 备受争议的Lombok,有的人喜欢它让代码更整洁,有的人不喜欢它,巴拉巴拉一堆原因.在我看来Lombok唯一的缺点可能就是需要安装插件了,但是对于业务开发的项目来说,它的优点远远超过缺点. 我们 ...

  5. 设计模式实战系列之@Builder和建造者模式

    前言 备受争议的Lombok,有的人喜欢它让代码更整洁,有的人不喜欢它,巴拉巴拉一堆原因.在我看来Lombok唯一的缺点可能就是需要安装插件了,但是对于业务开发的项目来说,它的优点远远超过缺点. 我们 ...

  6. .NET设计模式(4):建造者模式(Builder Pattern)(转)

    概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定. ...

  7. Builder 建造者模式

    简介 建造者模式的概念:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示. 大概的意思,就是一套的构建过程可以有不同的产品(表示)出来.这些产品(表示)都按照这一套的构建过程被 ...

  8. C#设计模式(5)——建造者模式

    1.建造者模式介绍 在软件开发中,有时我们要创建一个复杂的对象,这个对象由几个子部件按一定的步骤组合而成,这时候我们就可以使用建造者模式了.说到建造者我们首先想到的是盖房子,盖房子简单的说有三个步骤: ...

  9. .NET设计模式 第二部分 创建型模式(3)—建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) ——.NET设计模式系列之四 Terrylee,2005年12月17日 概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对 ...

随机推荐

  1. AES算法,DES算法,RSA算法JAVA实现

    1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...

  2. 微信小程序,前端大梦想(三)

    微信小程序的事件及生命周期   继续下节课,今天我们还是从四个方面来了解小程序:     ●常用事件和事件冒泡   ●配置   ●app生命周期及app对象的使用   ●页面的生命周期   一.事件的 ...

  3. 一些IO流的知识

    IO流: 输入流:输出流: 字节流:字符流:为了处理文字数据方便而出现的对象. 其实这些对象的内部使用的还是字节流(因为文字最终也是字节数据) 只不过,通过字节流读取了相对应的字节数,没有对这些字节直 ...

  4. 用ElasticSearch搭建自己的搜索和分析引擎

    作者:robben,腾讯高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 导语:互联网产品中的检索功能随处可见.当你的项目规模是百度大搜|商搜或者微信公众号搜索这种体量的时候 ...

  5. 使用 Http 的 Get 方式读取网络数据

    作为移动平台的应用,一定避免不了与网络交换数据,不论是读取网页数据,还是调用API接口,都必须掌握Http通信技术 代码如下: package zw1; import java.io.Buffered ...

  6. NPOI操作类

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  7. windows下使用wineshark分析抓取本地回环包

    ## 摘要 由于windows系统没有提供本地回环网络的接口,用Wireshark监控网络的话看不到localhost的流量. 想要获取本地的网络数据包,可以通过一款小巧的开源软件RawCap来进行抓 ...

  8. grunt构建一个项目

    准备工作:grunt基于node环境运行,所有先安装node.js 1.安装grunt,通过node的npm的包管理工具 >npm install grunt --save-dev 2.npm ...

  9. Mac IDEA插件——protobuf 插件

    最近在搞PB的版本的升级,历史的PB的版本是2.4,现在是打算升级到3.2,当面PB的版本肯定有很多变化了,就不再这里多说了,这里重点说一说,采用IDEA的插件方便执行PB的文件的JAVA编译,这样的 ...

  10. PHP原生DOM对象操作XML'代码'

    对于操作XML类型文件,PHP内置有一套DOM对象可以进行处理.对XML的操作,从创建.添加到修改.删除都可以使用DOM对象中的函数来进行. 创建 创建一个新的XML文件,并且写入一些数据到这个XML ...