应用场景

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

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

简述实现

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

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

  

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

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

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

  成品(Product):成品类。

  成品类(Car)

public class Car {
//车头
private CarHead carHead;
//车身
private CarBody carBody;
//车轮
private Wheel wheel;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Car() {}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Car(CarHead carHead, CarBody carBody, Wheel wheel) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.carHead =<span style="color: #000000;"> carHead;
</span><span style="color: #0000ff;">this</span>.carBody =<span style="color: #000000;"> carBody;
</span><span style="color: #0000ff;">this</span>.wheel =<span style="color: #000000;"> wheel;
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run(){
System.out.println(</span>"车开着 嘟嘟嘟嘟!!!"<span style="color: #000000;">);
} </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CarHead getCarHead() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> carHead;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setCarHead(CarHead carHead) {
</span><span style="color: #0000ff;">this</span>.carHead =<span style="color: #000000;"> carHead;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CarBody getCarBody() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> carBody;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setCarBody(CarBody carBody) {
</span><span style="color: #0000ff;">this</span>.carBody =<span style="color: #000000;"> carBody;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Wheel getWheel() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> wheel;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setWheel(Wheel wheel) {
</span><span style="color: #0000ff;">this</span>.wheel =<span style="color: #000000;"> wheel;
}

}

class CarHead{

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

class CarBody{

private String name;

public void setName(String name) {

this.name = name;

}

public String getName() {

return name;

}

}

class Wheel{

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

成品类

  抽象构建者(Builder)

public interface Builder {
//构造车头
void builderCarHead();
//构造车身
void builderCarBody();
//构造轮子
void builderWheel();
//得到构建成品
Car getCar();
}

  实际构造者(CarBuilder)

public class CarBuilder implements Builder{
Car car=new Car();
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> builderCarHead() {
System.out.println(</span>"构建车头!"<span style="color: #000000;">);
car.setCarHead(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CarHead());
} @Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> builderCarBody() {
System.out.println(</span>"构建车身!"<span style="color: #000000;">);
car.setCarBody(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CarBody());
} @Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> builderWheel() {
System.out.println(</span>"构建轮子!"<span style="color: #000000;">);
car.setWheel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Wheel());
} </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Car getCar(){
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span><span style="color: #000000;">.car;
}

}

  控制者(Director)

public class Director {
private Builder builder;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Director(Builder builder) {
System.out.println(</span>"控制车组装"<span style="color: #000000;">);
</span><span style="color: #0000ff;">this</span>.builder=<span style="color: #000000;">builder;
builder.builderCarHead();
builder.builderCarBody();
builder.builderWheel();
}

}

  客户端(Client)

public class Client {
public static void main(String[] args) {
//制造零件
Builder builder=new CarBuilder();
//组装汽车
Director director=new Director(builder);
//获得制造结果
Car car=builder.getCar();
//汽车开始跑
car.run();
}
}

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

版权声明

  作者:邱勇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. linux awk 命令详解

    awk是一个非常棒的数字处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个"字段"来处理.运行效率高,而且代码简单,对格式化的文本处理能力超强.先来一个 ...

  2. Java解决TopK问题(使用集合和直接实现)

    在处理大量数据的时候,有时候往往需要找出Top前几的数据,这时候如果直接对数据进行排序,在处理海量数据的时候往往就是不可行的了,而且在排序最好的时间复杂度为nlogn,当n远大于需要获取到的数据的时候 ...

  3. 使用HttpClient进行Get方式通信

    下载apache包 http://hc.apache.org/downloads.cgi 比较eclipse自带api,简单,易上手 实例: package zw1; import java.io.I ...

  4. hadoop、Storm该选哪一个

    如果hadoop.Storm还感觉混要,那么此篇文章将帮助你把他们完全区分 可以带着下面问题来阅读本文章: 1.hadoop.Storm各是什么运算 2.Storm为什么被称之为流式计算系统 3.ha ...

  5. struts2 之 struts2类型转换

    1. 在struts2中,相比servlet来时,获取数据时,程序员没有进行手动的类型转换,类型转换工作都有struts2来完成处理,但愿对于自定义类型数据,struts2不会帮助我们完成类型转换工作 ...

  6. CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序

    题目链接:http://codeforces.com/contest/655/problem/D 大意是给若干对偏序,问最少需要前多少对关系,可以确定所有的大小关系. 解法是二分答案,利用拓扑排序看是 ...

  7. Angular2.js——表单(下)

    这部分是接表单上部分的内容,主要内容有: 1.添加自定义的CSS来提供视觉反馈: 2.显示和隐藏有效性验证的错误信息: 3.使用ngSubmit处理表单提交: 4.禁用表单提交按钮. 添加自定义的CS ...

  8. Printk与sched_clock_init的一点分析

    在分析Linu内核启动的过程中,发现一段"不平常"的日志,感觉产生这段日志的代码肯定是"不可思议"的.因此就大致分析了一下: 日志如下: [ 0.000000] ...

  9. Servlet实现简单的登录页面

    package emp; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; imp ...

  10. 小米Adnroid默认禁止悬浮框的使用,导致开发的悬浮框无法接收事件

    比如你建了一个悬浮框: WindowManager windowManager = getWindowManager(context); int screenWidth = windowManager ...