原文地址:Java 设计模式之建造者模式(四)

博客地址:http://www.extlight.com

一、前言

今天继续介绍 Java 设计模式中的创建型模式--建造者模式。上篇设计模式的主题为 《Java 设计模式之抽象工厂模式(三)》

二、简单介绍

建造者模式/生成器模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

建造者模式实现过程通常分成 2 个步骤:构建(Builder)和装配(Director)。此处的英文不是对汉字的翻译而是为了说明这两个步骤需要用到的接口类型。

2.1 应用场景

  1. 对象的创建:建造者模式是为对象的创建而设计的模式。如:StringBuilder、DomBuilder、SAXBuilder。

  2. 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象。

  3. 关注对象创建的各部分的创建过程:不同的工厂(Builder)对产品属性有不同的创建方法。

三、实现方式

同样地,我们还是以创建轿车为例。

实体类:

public class Car {

	private Engine engine;

	private Tyre tyre;

	private Seat seat;

	public void intro() {
this.engine.intro();
this.tyre.intro();
this.seat.intro();
} public Engine getEngine() {
return engine;
} public void setEngine(Engine engine) {
this.engine = engine;
} public Tyre getTyre() {
return tyre;
} public void setTyre(Tyre tyre) {
this.tyre = tyre;
} public Seat getSeat() {
return seat;
} public void setSeat(Seat seat) {
this.seat = seat;
} } class Engine { public void intro() {
System.out.println("开得快");
}
} class Tyre {
public void intro() {
System.out.println("耐磨防滑");
}
} class Seat {
public void intro() {
System.out.println("坐得舒适");
}
}

Car 类的实例就是一个复合对象。

未使用建造者模式时,客户端调用如下:

public class Client {

	public static void main(String[] args) {
// 创建组装部件
Engine engine = new Engine();
Tyre tyre = new Tyre();
Seat seat = new Seat();
// 组装
Car car = new Car();
car.setEngine(engine);
car.setTyre(tyre);
car.setSeat(seat); car.intro(); }
}

上边的代码中,违背了单一职责原则,客户端与多个类进行了耦合,导致代码扩展性不强。

接下来我们使用建造者模式让代码变得灵活起来。

Builder 接口与实现类,用来实现构建过程:

public interface CarBuilder {

	Engine buildEngine();

	Tyre buildTyre();

	Seat buildSeat();
} class MyCarBuilder implements CarBuilder { @Override
public Engine buildEngine() {
return new Engine();
} @Override
public Tyre buildTyre() {
return new Tyre();
} @Override
public Seat buildSeat() {
return new Seat();
} }

此处使用了工厂模式创建组装轿车的各个部件。很多时候,设计模式并不是单独使用,而是配合使用。

为了编写和测试方便,笔者没有对 Engine、Tyre 和 Seat 类进行抽象。

Director 接口与实现类,用来实现装配过程:

public interface CarDirector {

	Car directCar();
} class MyCarDirector implements CarDirector { private CarBuilder carBuilder; public MyCarDirector(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
} @Override
public Car directCar() {
Engine engine = this.carBuilder.buildEngine();
Tyre tyre = this.carBuilder.buildTyre();
Seat seat = this.carBuilder.buildSeat();
// 装配
Car car = new Car();
car.setEngine(engine);
car.setTyre(tyre);
car.setSeat(seat); return car;
} }

通过 directCar 方法,隐藏复合对象(Car 实例)的创建过程。

客户端:

public class Client {

	public static void main(String[] args) {

		CarDirector director = new MyCarDirector(new MyCarBuilder());

		Car car = director.directCar();

		car.intro();

	}
}

现在,客户端代码变得简洁了。因为建造者模式遵循了依赖倒转原则,我们只要将客户端的 Builder 或 Director 替换不同的接口实现类(多态),就能体现出代码灵活性了。

UML 类图表示如下:

Java 设计模式之建造者模式(四)的更多相关文章

  1. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  2. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  3. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  4. Java设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  5. Java设计模式之三建造者模式和原型模式

    建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...

  6. java设计模式之建造者模式

    学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...

  7. java设计模式之四建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

  8. java设计模式3.建造者模式、原型模式

    建造者模式 一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才 ...

  9. Java设计模式之建造者模式(Builder Pattern)

    前言 这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点. 一.建造者介绍 ​ 用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现 ...

随机推荐

  1. dva-loading使用方法

    1. 下载dva-loading npm install dva-loading --save 2. 导入并使用dva-loading import createLoading from 'dva-l ...

  2. MySQL的登陆错误:ERROR 1049 (42000): Unknown database 'root'

    当初刚装MySQL的时候,到网上查的命令行登陆MySQL的方法都是mysql -u root -p password mysql -r root -p 123456 但是奇怪的是这条命令我输进去死活都 ...

  3. Linux IPv6 地址配置

    添加IPV6地址ip -6 addr add <ipv6address>/<prefixlength> dev <interface>ip -6 addr add ...

  4. vue踩坑之旅 -- computed watch

    vue踩坑之旅 -- computed watch 经常在使用vue初始化组件时,会报一些莫名其妙的错误,或者,数据明明有数据,确还是拿不到,这是多么痛苦而又令人忍不住抓耳挠腮,捶胸顿足啊 技术点 v ...

  5. SqlServer 转 Oracle 的几点注意

    (转自:http://www.2cto.com/database/201208/146740.html) 1.字符型的字段相加需要用“||”,如果用“+”的话,会报“无效的数字”的错误.   2.类似 ...

  6. Java--------------Windows下Redis的安装使用

    摘要 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted s ...

  7. js 计算时间

    var date1=new Date();  //开始时间   var date2=new Date();    //结束时间 var date3=date2.getTime()-date1.getT ...

  8. 复位compiz和unity

    compiz是最最不稳定的组件....绝大部分死机(图形界面没反应)都是由于这货. 所以为了我们系统的稳定,最好不要蛋疼去修改compiz的配置添加神马3D特效,这样导致更不稳定,这样做之后估计你一整 ...

  9. Python3的第一个程序(三)

    现在,了解了如何启动和退出Python的交互式环境,我们就可以正式开始编写Python代码了. 在写代码之前,请千万不要用“复制”-“粘贴”把代码从页面粘贴到你自己的电脑上.写程序也讲究一个感觉,你需 ...

  10. 《Effective C++》第8章 定制new和delete-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...