前言:

最近一直在学习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)的更多相关文章

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

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

  2. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

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

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

  4. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  5. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  6. JAVA设计模式总结—建造者模式

    建造者模式 模式动机与定义 ​ 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. ​ 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...

  7. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

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

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

  9. 【java】java 设计模式(4):建造者模式(Builder)

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

随机推荐

  1. Hive文件存储格式

    hive文件存储格式 1.textfile textfile为默认格式   存储方式:行存储   磁盘开销大 数据解析开销大   压缩的text文件 hive无法进行合并和拆分 2.sequencef ...

  2. js学习笔记

    javacript笔记根据EC5.0一共有六种数据类型:number,string,bool undefine,nullobject(广义的) --->object(狭义的),array,fun ...

  3. bzoj 刷水

    bzoj 3856: Monster 虽然是sb题,,但是要注意h可能<=a,,,开始忘记判了WA得很开心. #include <iostream> #include <cst ...

  4. Web服务器控件之button

    button有两种类型的按钮,一种是提交按钮,一种是命令按钮.只说命令按钮. 命令按钮事要使用两个属性,分别是CommandName和CommandArguement属性,当该按钮被点击时,将页面中的 ...

  5. Java的书写格式,标识符及命名规则,注释

    Java的书写格式,标识符及命名规则,注释 1.Java语言的书写格式(约定成俗) 1) 大括号要对齐(左大括号与句尾对其,后面大括号与句头对齐),并且成对写 2) 左大括号前面有空格 3) 遇到左大 ...

  6. 线上应用bug跟踪查找-友盟统计

    线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...

  7. IE7中使用Jquery动态操作name问题

    问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就 ...

  8. .NET中提升UAC权限的方法总结

    [题外话] 从Vista开始,由于增加了UAC(用户账户控制,User Account Control)功能,使得管理员用户平时不再拥有能控制所有功能的管理员权限了,所以在调用很多比较重要的功能时需要 ...

  9. SQL Server 事务日志传输

    概述 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使辅助数据库与主数据库基本保持 ...

  10. CI框架搭建

    CI 框架等移植到不同等环境十分方便,只要改很少等配置: 1.修改config.php 文件(修改这一个文件就可以跑通了): $config['base_url'] = 'http://127.0.0 ...