Java设计模式之建造者模式(Builder)
前言:
最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式。
建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景:
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
主要组成部分
Builder 是为创建一个product对象的各个部件指定的抽象接口
ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件
Director 他是构建一个使用Builder接口的对象
Product 表示被构造的复杂对象
举例说明
对于上面的描述多多少少会让人感觉一头雾水,接下来我们以一个简单的例子来说明一下。模拟一个需求:李先生想要托人建造一个马力为300,轮胎尺寸为18的suv,我们该如何通过建造者模式满足李先生的需求呢。
1.)第一步先基于李先生的要求 确定这部suv的部件
Car类
public class Car {
private final Engine engine;
private final Tyre tyre;
Car() {
this(new Builder());
}
Car(final Engine engine, final Tyre tyre) {
this.engine = engine;
this.tyre = tyre;
}
Car(Builder builder) {
this.engine = builder.engine;
this.tyre = builder.tyre;
}
public void startDrive() {
this.engine.startRun();
this.tyre.startGo();
}
}
Engine类
final class Engine {
private int power;
Engine(int power) {
this.power = power;
}
Engine() {
this.power = 235;
}
public void startRun() {
Log.e("startRun", "startRun----->" + power);
}
}
Tyre类
final class Tyre {
private int size;
Tyre(int size) {
this.size = size;
}
Tyre() {
this.size = 18;
}
public void startGo() {
Log.e("startRun", "startGo----->" + size);
}
}
2.)第二步我们按照需求安排工序
interface ICar {
/**
* 建造一个发动机
* @param power
*/
void buildEngine(int power);
/**
* 安装一个轮胎
* @param size
*/
void buildTyre(int size);
/**
* 组装车辆
* @return
*/
Car build();
}
3.)第三步安排建造者生产
public static class Builder implements ICar {
private Engine engine;
private Tyre tyre;
private Builder(Car car) {
this.engine = car.engine;
this.tyre = car.tyre;
}
public Builder() {
engine = new Engine();
tyre = new Tyre();
}
@Override
public void buildEngine(int power) {
this.engine = new Engine(power);
}
@Override
public void buildTyre(int size) {
this.tyre = new Tyre(size);
}
@Override
public Car build() {
return new Car(this);
}
}
4.)生产完毕交付到李先生手里
Car.Builder builder = new Car.Builder();
builder.buildEngine(120);
builder.buildTyre(30);
Car car = builder.build();
car.startDrive();
5.)一般情况下Director ,Product 放在一个类里实现 详细代码如下
public class Car {
private final Engine engine;
private final Tyre tyre;
Car() {
this(new Builder());
}
Car(final Engine engine, final Tyre tyre) {
this.engine = engine;
this.tyre = tyre;
}
Car(Builder builder) {
this.engine = builder.engine;
this.tyre = builder.tyre;
}
public void startDrive() {
this.engine.startRun();
this.tyre.startGo();
}
public Builder newBuilder() {
return new Builder(this);
}
public static class Builder implements ICar {
private Engine engine;
private Tyre tyre;
private Builder(Car car) {
this.engine = car.engine;
this.tyre = car.tyre;
}
public Builder() {
engine = new Engine();
tyre = new Tyre();
}
@Override
public void buildEngine(int power) {
this.engine = new Engine(power);
}
@Override
public void buildTyre(int size) {
this.tyre = new Tyre(size);
}
@Override
public Car build() {
return new Car(this);
}
}
}
小结
整个例子里面特别注意一下类的权限已经构造函数的权限控制,其实李先生从下单到提车对整个过程的细节一无所知,这样就有效的实现建造者模式的好处,很好的让造车其中各个复杂的环节与造车剥离开。
Java设计模式之建造者模式(Builder)的更多相关文章
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- JAVA设计模式总结—建造者模式
建造者模式 模式动机与定义 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- java设计模式之四建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
- 【java】java 设计模式(4):建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
随机推荐
- 20161022 NOIP模拟赛 T1 解题报告
旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...
- Docker学习笔记第一章:补充
只记得学习后面的命令,忘记整理一些概念性的东西了,只能做个补充了=.= Docker虽然也是一种虚拟技术,但是不同于虚拟机的概念.Docker是一种以容器为主的技术,容器运行不需要模拟层(emulat ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
- navicat 结合快捷键
ctrl+q 打开查询窗口ctrl+/ 注释sql语句ctrl+shift +/ 解除注释ctrl+r 运行查询窗口的sql语句ctrl+shift+r 只运行选中的sql语句F6 打开一个mysql ...
- 简单正则匹配QQ邮箱
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <script src ...
- 谈asch系统的共识机制与容错性
本文章出自:http://blog.asch.so/,转载请注明出处. 0 前言 我曾分析了DPOS算法的漏洞并且模拟了一个简单的攻击的方法,然后实现了一个简化的PBFT算法模型试图去修复该漏洞,并且 ...
- ABP理论学习之N层架构
返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...
- Azure 新的管理模式 —— Resource Manager
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- golang reflect
golang reflect go语言中reflect反射机制.详细原文:地址 接口值到反射对象 package main import ( "fmt" "reflect ...
- ASP.NET MVC 控制器激活(一)
ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...