建造者模式(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. 图解HTTP / HTTPS

    http://kb.cnblogs.com/page/155287/ 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议 ...

  2. ADO.net之综合演练

    using ConsoleApplication4.App_Code; using System; using System.Collections.Generic; using System.Lin ...

  3. JVM虚拟机宕机_java.lang.OutOfMemoryError: unable to create new native thread

    原因:当前用户的系统最最大程序数数已达到最大值,使用ulimit -u可以看到是1024   解决办法:在当前用户下使用ulimit -u 65535 然后再执行jsp,一切ok     功能说明:控 ...

  4. 企业微信二次开发之-如何获取secret序列号

    第一步:登录JEEWX后台,配置微信企业号账号信息(企业号.企业号应用) [1].配置企业微信信息 参数对应位置参考如下: [2].配置应用信息 必须四字段: 第二步: 登录企业微信后台,配置企业号应 ...

  5. vue .map 文件

    参数: productionSourceMap:false 这个改为false.去掉打包产生的map文件 map文件的作用:定位线上错误代码位置;

  6. ELK实时日志分析平台环境部署--完整记录(转)

    在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...

  7. C语言复习:内存模型2

    函数调用模型 基本原理 实际上就是不断的从一个内存跳到另一个内存. 函数调用变量传递分析 一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区? 答:一个程序只有一个堆区和一个栈区. 函数 ...

  8. apache-php

    1.安装apache https://www.cnblogs.com/lxlb/p/9159056.html 2.安装php https://www.cnblogs.com/37yan/p/68794 ...

  9. 【剑指offer】将字符串中的空格替换成"%20"

    #include <iostream> #include <string> using namespace std; char *ReplaceSpace(char *str, ...

  10. 【剑指offer】从尾到头翻转打印单链表

    #include <iostream> #include <vector> #include <stack> using namespace std; struct ...