建造者模式(Builder): 使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,提供一种创建对象的最佳方式。

应用:

  比如坑德基的汉堡、薯条、可乐、鸡翅是不变的,但是套餐是经常变化的

  Java 中的 StringBuilder

如何使用: 一些基本部件不变,而其组合经常变化

与工厂模式的不同:建造者关注零件的组装过程,而工厂方法模式更关注零件的创建过程

建造者组成: 产品、抽象建造者、具体建造者、指挥者 4 个要素组成

例如:

【产品】装修一套房子:沙发、灯、浴室、地板

【指挥者】 Leader 指挥工人装修

【具体的建造者】工人

public class Room {

    //沙发
private String sofa;
//灯
private String light;
//浴室
private String bashroom;
//地板
private String floor; public String getSofa() {
return sofa;
} public void setSofa(String sofa) {
this.sofa = sofa;
} public String getLight() {
return light;
} public void setLight(String light) {
this.light = light;
} public String getBashroom() {
return bashroom;
} public void setBashroom(String bashroom) {
this.bashroom = bashroom;
} public String getFloor() {
return floor;
} public void setFloor(String floor) {
this.floor = floor;
} @Override
public String toString() {
return "Room{" +
"sofa='" + sofa + '\'' +
", light='" + light + '\'' +
", bashroom='" + bashroom + '\'' +
", floor='" + floor + '\'' +
'}';
}
}
public abstract class Builder {

    //计划装修房子
protected Room room = new Room();
public abstract void buildSofa();
public abstract void buildLight();
public abstract void buildBashRoom();
public abstract void buildFloor(); public Room getResult(){
return room;
} }
public class WorkerBuilder extends Builder{
@Override
public void buildSofa() {
room.setSofa("香港皇家沙发");
System.out.println("装修:香港皇家沙发");
} @Override
public void buildLight() {
room.setLight("德州进口灯");
System.out.println("装修:德州进口灯");
} @Override
public void buildBashRoom() {
room.setBashroom("伊丽莎白同款浴室");
System.out.println("装修:伊丽莎白同款浴室");
} @Override
public void buildFloor() {
room.setFloor("天空绚烂地板");
System.out.println("装修:天空绚烂地板");
}
}
public class Leader {

    protected Builder builder;

    public Leader(Builder builder){
this.builder = builder;
} public Room construct(){
builder.buildBashRoom();
builder.buildFloor();
builder.buildLight();
builder.buildSofa();
return builder.getResult();
}
}
public class Client {
public static void main(String []args){
Builder builder = new WorkerBuilder();
Leader leader = new Leader(builder);
Room newRoom = leader.construct();
System.out.println(newRoom);
}
}

结果:

七、Builder 建造器模式的更多相关文章

  1. 浅谈设计模式--建造器模式(Builder Pattern)

    建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...

  2. 6. 星际争霸之php设计模式--建造器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. Java设计模式之(七)——装饰器模式

    1.什么是装饰器模式? Attach additional responsibilities to an object dynamically keeping the same interface.D ...

  4. Java设计模式:Builder(构建器)模式

    概念定义 Builder模式是一步一步创建一个复杂对象的创建型模式.该模式将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来. 应用场景 对象创建过程比较复杂,或对创建顺序或组合有依 ...

  5. 设计模式(5)--Builder(建造模式)--创建型

    1.模式定义: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品 ...

  6. Java设计模式(七)Decorate装饰器模式

    一.场景描述 (一)问题 系统中最初使用Crystal Report(水晶报表)工具生成报表,并将报表发送给客户端查看,此时定义一CrystalReport工具类即可完成水晶报表的生成工作. 后续报表 ...

  7. jvm七种垃圾收集器

    JVM_七种垃圾收集器介绍   本文中的垃圾收集器研究背景为:HotSpot+JDK7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老 ...

  8. 设计模式(8)--Decorator--装饰器模式--结构型

    1.模式定义: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.模式特点:    装饰模式能够实现动态的为对象添加功能,是从一个对象 ...

  9. 设计模式---领域规则模式之解析器模式(Interpreter)

    前提:领域规则模式 在特定领域内,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式 解析器模式:Interpreter ...

随机推荐

  1. 转载:C++函数中new一块内存,作为返回值

    转载来自:http://blog.itpub.net/7728585/viewspace-2123621/ 今天遇到一个问题,C++编程时,函数中new一块内存,然后将申请内存的指针作为返回值.怎么d ...

  2. Ajax 要点

    Ajax 全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML) Ajax的实现是基于 xmlHttp对象 异步发送请求 XMLHttpReque ...

  3. offsetof使用小结

    先上例子 #include <stdio.h> #include <stdlib.h> /* offsetof example */ #include <stddef.h ...

  4. js 深度拷贝

    js 数据类型 分为2种: 基本数据类型:Undefined.Null.Boolean.Number.String 复杂数据类型:Object.Array.function 他们的区别是在内存中的存储 ...

  5. AIR程序调用本地默认应用程序打开本地文件

    当我用下面语句的时候,可以成功打开桌面文件夹下面的文件: var file:File = File.desktopDirectory.resolvePath("test.jpg") ...

  6. [AS3]as3中splice和slice的用法介绍说明

    splice 删除数组一段连续的元素,返回被删除的元素数组 var arr:Array = ["a","b","c","d&quo ...

  7. Raft算法和Gossip协议

    简单介绍下集群数据同步,集群监控用到的两种常见算法. Raft算法 raft 集群中的每个节点都可以根据集群运行的情况在三种状态间切换:follower, candidate 与 leader.lea ...

  8. Linux 循环创建多个线程

    这里说一下相关的基础知识: 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下)     进程:独立地址空间,拥有PCB     线 ...

  9. 【BUG记录】记一次游戏越来越卡的BUG

    U3D的MOBA项目,测试过程中,10分钟以后,游戏帧率开始缓慢下降,约3-5分钟后,由60帧下降到小于10帧,编辑器模式. 打开profiler,看到CPU占用非常高,每帧都有24K的GC, 时间占 ...

  10. jenkins com.jcraft.jsch.JSchException: Auth cancel

    jenkins构建时报如下错误: 首先去系统管理--->系统设置上看看SCP插件中的用户名和密码是否正确