应用场景

  假设现在我们要设计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. 关于阿里图标库Iconfont生成图标的三种使用方式(fontclass/unicode/symbol)

    1.附阿里图标库链接:http://www.iconfont.cn/ 2.登录阿里图标库以后,搜索我们需要的图标,将其加入购物车,如图3.将我们需要的图标全部挑选完毕以后,点击购物车图标4.这时候右侧 ...

  2. 在ASP.NET MVC4中配置Castle

    ---恢复内容开始--- Castle是针对.NET平台的一个非常优秀的开源项目,重点是开源的哦.它在NHibernate的基础上进一步封装,其原理基本与NHibernate相同,但它较好地解决NHi ...

  3. HibernateTemplate的使用

    HibernateTemplate 提供了非常多的常用方法来完成基本的操作,比如增加.删除.修改及查询等操作,Spring 2.0 更增加对命名 SQL 查询的支持,也增加对分页的支持.大部分情况下, ...

  4. Weex的环境搭建以及集成到Android项目

    最近由于公司的需要,初步研究了Weex,Weex是阿里开发的一个web的框架,官方的介绍如下: Weex 是一套简单易用的跨平台开发方案,能以 web 的开发体验构建高性能.可扩展的 native 应 ...

  5. android-studio-bundle-141.2178183首次执行Hello World的时候出现ADB not responding. If you'd like to retry, then please manually kill "adb.e的错误

    这是由于有其他程序在占用adb.exe要使用的端口5037,打开命令提示符cmd,输入指令netstat -aon|findstr 5037查看在使用此端口的程序,如 8036即为占用该端口号的PID ...

  6. linux命令之crontab定时执行任务

    一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动c ...

  7. XStream的使用

    一:功能 可以将JavaBean转换(序列化)成XMl 二:依赖jar包 xstream.jar xpp3_min.jar(xml pull parser)xml解析器 三:使用步骤 XStream ...

  8. qt 文本中显示中文

    QTextCodec *codec = QTextCodec::codecForName("utf8");QTextCodec::setCodecForLocale(codec); ...

  9. Windows 和 Mac 系统下安装git 并上传,修改项目

    首先在MAC上怎么操作. 在gitHub创立一个账户,在创立一个项目,这就不用我说了对吧. 创建完之后是这样的: 接下来,我们打开https://brew.sh 这是下载homebrew的网站,hom ...

  10. linux 安装memcached C/C++使用libmemcached库(续)

    #include <iostream> #include <string> #include <libmemcached/memcached.h> using na ...