应用场景

  假设现在我们要设计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. Python爬虫 URLError异常处理

    1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的服务器 服务器不存在 在代码中,我们需要用try-except语句来包围并捕获相应的异常.下 ...

  2. 如何在 FineUIMvc 中引用第三方 JavaScript 库

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...

  3. Doctype 文档类型,标准模式,混杂模式

    HTML4.01和XHTML1.0 基于 SGML,支持DTD声明,HTML5不是,但是需要 doctype 来规范浏览器的行为. 标准模式是指,DTD声明定义了标准文档的类型后,浏览器按W3C标准解 ...

  4. 想询问一个职业规划的问题,前端开发 or nodejs?

    先说说个人情况,目前个人定位于初中级前端吧,工作近两年,目前前端开发和nodejs都有一定的了解,水平感觉可以搭一些小型的网站.作为前端开发,目前掌握的技术是javascript,平时更多的是用jqu ...

  5. CF #April Fools Day Contest 2016 E Out of Controls

    题目连接:http://codeforces.com/problemset/problem/656/E 愚人节专场的E,整个其实就是个Floyd算法,但是要求代码中不能包含 definedoforfo ...

  6. 五十行javascript代码实现简单的双向数据绑定

    五十行javascript代码实现简单的双向数据绑定 Vue框架想必从事前端开发的同学都使用过,它的双向数据绑定机制能给我们带来很大的方便.今天闲着没事,尝试着实现一下双向数据绑定,接下来给大家分享一 ...

  7. 蓝桥杯-第39级台阶-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  8. 1012 u Calculate e

    A simple mathematical formula for e iswhere n is allowed to go to infinity. This can actually yield ...

  9. python3 selenium 鼠标悬停操作

    使用场景: 测试过程中有些元素隐藏在某些元素下面,需要鼠标悬停,才会看到 使用方法: # 定位元素hover_element = driver.find_element_by_css_selector ...

  10. javascript的面向对象详解

    每次说到javascript到面向对象,总感觉自己心里懂,但是却不知道该怎么说,这就是似懂非懂到表现,于是乎,每次一说,就要到处去查找资料,零零碎碎到看了一些,感觉有懂了,但是过段时间,好像又不知道是 ...