设计模式之建造模式

创建型模式之建造者模式

定义

  • 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
  • 简单说,建造者的功能就是先构造复杂对象的每一个部件,指挥者的功能就是将这些部件以一定的步骤组装起来,形成一个具有一定功能的产品或者对象。当然这个步骤是透明的对于客户端。
  • 建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式结构如图8-2所示:

建造者模式

实例

  • 下面是一个组装汽车的例子,其中汽车由发动机和轮胎组成,那么我们只需要组装轮胎,发动机即可组装完成一个汽车。
  • 汽车包括轮胎,引擎,我们通常在组装汽车的时候一般都是一步一步的组装,比如先装引擎,后装轮胎。使用建造者模式就是将建造汽车的这个过程抽离成几个不同的过程,比如建造引擎和建造轮胎就是两个过程。
  • 轮胎的JavaBean
/*
 * 轮胎
 */
class Tyre {
	private String name;

	public Tyre(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
  • 引擎的JavaBean
/*
 * 引擎
 */
class Engine {

	private String name;

	public Engine(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
  • 汽车的JavaBean(汽车包含轮胎和引擎,因此使用聚合的关系)
/*
 * 汽车的类
 */
public class Car {

	private Tyre tyre; // 轮胎
	private Engine engine;  // 引擎

	public Tyre getTyre() {
		return tyre;
	}

	public void setTyre(Tyre tyre) {
		this.tyre = tyre;
	}

	public Engine getEngine() {
		return engine;
	}

	public void setEngine(Engine engine) {
		this.engine = engine;
	}
}
  • 抽象建造者(实际上是一个接口,其中定义了建造轮胎和引擎的方法)
public interface Builder {
	/**
	 * 构造引擎的方法
	 */
	Engine buliderEngine();

	/**
	 * 构造轮胎的方法
	 */
	Tyre builderTyre();
}
  • 具体的建造者(实现了抽象建造者,实现建造轮胎和引擎的详细过程)
/*
 * 具体的建造者,主要是构造汽车的部件
 */
public class BuilderCar implements Builder {
	@Override
	public Engine buliderEngine() {
		System.out.println("构造汽车发动机");
		return new Engine("傻逼牌发动机");
	}

	@Override
	public Tyre builderTyre() {
		System.out.println("构造汽车轮胎");
		return new Tyre("傻逼牌轮胎");
	}
}
  • 抽象指挥者(定义了一个构造汽车的方法),指挥者的作用就是按照一定步骤将构造者建造的部件组装起来
/*
 * 	指挥者的接口,用来按照顺序组装汽车
 */
public interface Director {
	Car CreateCar();
}
  • 具体的指挥者(实现了指挥者接口)
/*
 * 指挥者的实现类
 */
public class DirectorCar implements Director {

	private Builder builder; // 建造者的对象

	/**
	 * 构造方法,主要用来初始化建造者对象
	 *
	 * @param builder  Builder的对象
	 */
	public DirectorCar(Builder builder) {
		this.builder = builder;
	}

	@Override
	public Car CreateCar() {
		Car car = new Car(); // 创建汽车对象
		Engine engine = builder.buliderEngine(); // 构建发动机
		Tyre tyre = builder.builderTyre(); // 构造轮胎
		car.setEngine(engine); // 设置属性
		car.setTyre(tyre); // 设置属性
		return car; // 返回构造好的汽车
	}
}
  • 测试类
public class Client {
	public static void main(String[] args) {
		Director director = new DirectorCar(new BuilderCar()); // 创建指挥者的对象
		Car car = director.CreateCar(); // 获取组装完成的
		System.out.println(car.getEngine().getName()); // 输出引擎的名字
		System.out.println(car.getTyre().getName()); // 输出轮胎的名字
	}
}

适用场景

  • 基本部件不变,但是其中的组合经常变化的情况
    • 比如你去肯德基点餐,汉堡,可乐,鸡翅这些食物是不变的,但是套餐的组合是经常变化的,建造者模式的指挥者就是将这些部件按照一定步骤将其组合起来的。
    • java中StringBuilder
  • 需要生成的对象具有复杂的内部结构
    • 复杂的内部结构,我们可以使用建造者模式将其分离,先将其中的各个小的部件组装成功,然后由指挥者按照一定的步骤将其组装成一个复杂的对象
  • 需要生成的对象内部属性本身相互依赖。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

Batik渲染png图片异常的bug修复全程记录

batik是apache的一个开源项目,可以实现svg的渲染,后端借助它可以比较简单的实现图片渲染,当然和java一贯处理图片不太方便一样,使用起来也有不少坑

2517
来自专栏函数式编程语言及工具

ScalaPB(2): 在scala中用gRPC实现微服务

2733
来自专栏生信宝典

network3D 交互式网络生成

networkD3是基于D3JS的R包交互式绘图工具,用于转换R语言生成的图为交互式网页嵌套图。目前支持网络图,桑基图,树枝图 (后续相继推出)等。 关于网络图...

2975
来自专栏殷源的专栏

JavaScriptCore全面解析 (上篇)

本文主要讲解iOS中的JavaScriptCore框架,正是它为iOS提供了执行JavaScript代码的能力。未来的技术日新月异,JavaScript与iOS...

8.7K9
来自专栏岑玉海

Carbondata源码系列(一)文件生成过程

在滴滴的两年一直在加班,人也变懒了,就很少再写博客了,最近在进行Carbondata和hive集成方面的工作,于是乎需要对Carbondata进行深入的研究。 ...

6206
来自专栏影子

SpringBoot中关于Mybatis使用的三个问题

985
来自专栏大前端_Web

easyUI组件datagrid的二次封装

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

2593
来自专栏JadePeng的技术博客

使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring D...

5235
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第二节 - Spring框架 AOP的丧心病狂解说,你喜欢露娜的月下无限连吗?据说露娜要重做,玩个屁,劳资退游吃鸡去了,谢谢。

2845
来自专栏小灰灰

Batik渲染png图片异常的bug修复

Batik渲染png图片异常的bug修复 batik是apache的一个开源项目,可以实现svg的渲染,后端借助它可以比较简单的实现图片渲染,当然和java一贯...

1989

扫码关注云+社区

领取腾讯云代金券