专栏首页码猿技术专栏设计模式之建造模式

设计模式之建造模式

创建型模式之建造者模式

定义

  • 建造者模式(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 条评论
登录 后参与评论

相关文章

  • Springmvc响应Ajax请求(@ResponseBody)

    爱撒谎的男孩
  • Struts2之获取请求参数

    爱撒谎的男孩
  • 设计模式之原型模式

    爱撒谎的男孩
  • Struts2学习---基本配置,action,动态方法调用,action接收参数 动态方法调用action接收参数

    首先我们先来直接配置,然后再来讲原理: 第一步:jar包的引入: 我们可以到struts2的官网上下载: http://struts.apache.org...

    MindMrWang
  • ​PHP设计模式之建造者模式

    建造者模式,也可以叫做生成器模式,builder这个词的原意就包含了建筑者、开发者、创建者的含义。很明显,这个模式又是一个创建型的模式,用来创建对象。那么它的特...

    硬核项目经理
  • 完整案例分析再加知识整合——艾特抽象工厂模式,超详细的

    泰斗贤若如
  • 注解与依赖注入

    1.Product package com.how2java.pojo; import org.springframework.beans.factory.a...

    互联网金融打杂
  • SpringMVC 框架系列之初识与入门实例

    微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、SpringMVC 概述 (1)、 MVC:Mode...

    compassblog
  • Struts2中的Ajax请求

    1. 使用Stream result的方式以流的形式写出到客户端。(这种方式我没有亲自做实验,下面的例子参考的是Struts2的官方文档)

    卡尔曼和玻尔兹曼谁曼
  • Hibernate文件配置

    映射需要通过XML的配置文件来完成,这个配置文件尽量统一(xxx.hbm.xml) Hibernate核心的配置:必须的配置、可选的配置、映射文件的引入

    用户3112896

扫码关注云+社区

领取腾讯云代金券