java设计模式builder_Java设计模式之建造者模式(Builder)

前言:

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

建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场景:

当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

当构造过程必须允许被构造的对象有不同的表示时。

主要组成部分

Builder 是为创建一个product对象的各个部件指定的抽象接口

ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件

Director 他是构建一个使用Builder接口的对象

Product 表示被构造的复杂对象

举例说明

对于上面的描述多多少少会让人感觉一头雾水,接下来我们以一个简单的例子来说明一下。模拟一个需求:李先生想要托人建造一个马力为300,轮胎尺寸为18的suv,我们该如何通过建造者模式满足李先生的需求呢。

1.)第一步先基于李先生的要求 确定这部suv的部件

Car类

public classCar {private finalEngine engine;private finalTyre tyre;

Car() {this(newBuilder());

}

Car(final Engine engine, finalTyre tyre) {this.engine =engine;this.tyre =tyre;

}

Car(Builder builder) {this.engine =builder.engine;this.tyre =builder.tyre;

}public voidstartDrive() {this.engine.startRun();this.tyre.startGo();

}

}

Engine类

final classEngine {private intpower;

Engine(intpower) {this.power =power;

}

Engine() {this.power = 235;

}public voidstartRun() {

Log.e("startRun", "startRun----->" +power);

}

}

Tyre类

final classTyre {private intsize;

Tyre(intsize) {this.size =size;

}

Tyre() {this.size = 18;

}public voidstartGo() {

Log.e("startRun", "startGo----->" +size);

}

}

2.)第二步我们按照需求安排工序

interfaceICar {/*** 建造一个发动机

*@parampower*/

void buildEngine(intpower);/*** 安装一个轮胎

*@paramsize*/

void buildTyre(intsize);/*** 组装车辆

*@return

*/Car build();

}

3.)第三步安排建造者生产

public static class Builder implementsICar {privateEngine engine;privateTyre tyre;privateBuilder(Car car) {this.engine =car.engine;this.tyre =car.tyre;

}publicBuilder() {

engine= newEngine();

tyre= newTyre();

}

@Overridepublic void buildEngine(intpower) {this.engine = newEngine(power);

}

@Overridepublic void buildTyre(intsize) {this.tyre = newTyre(size);

}

@OverridepublicCar build() {return new Car(this);

}

}

4.)生产完毕交付到李先生手里

Car.Builder builder = newCar.Builder();

builder.buildEngine(120);

builder.buildTyre(30);

Car car=builder.build();

car.startDrive();

5.)一般情况下Director ,Product 放在一个类里实现 详细代码如下

public classCar {private finalEngine engine;private finalTyre tyre;

Car() {this(newBuilder());

}

Car(final Engine engine, finalTyre tyre) {this.engine =engine;this.tyre =tyre;

}

Car(Builder builder) {this.engine =builder.engine;this.tyre =builder.tyre;

}public voidstartDrive() {this.engine.startRun();this.tyre.startGo();

}publicBuilder newBuilder() {return new Builder(this);

}public static class Builder implementsICar {privateEngine engine;privateTyre tyre;privateBuilder(Car car) {this.engine =car.engine;this.tyre =car.tyre;

}publicBuilder() {

engine= newEngine();

tyre= newTyre();

}

@Overridepublic void buildEngine(intpower) {this.engine = newEngine(power);

}

@Overridepublic void buildTyre(intsize) {this.tyre = newTyre(size);

}

@OverridepublicCar build() {return new Car(this);

}

}

}

小结

整个例子里面特别注意一下类的权限已经构造函数的权限控制,其实李先生从下单到提车对整个过程的细节一无所知,这样就有效的实现建造者模式的好处,很好的让造车其中各个复杂的环节与造车剥离开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值