前言
建造者模式属于创建型模式,他提供了一种创建对象的最佳方式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接按顺序创建复杂的对象(把内部的构造过程和细节隐藏起来),指需要知道结果不需要知道过程。
一、案例
例子:
- 工厂(建造者模式):负责制造汽车、电动车(组装过程和细节在工厂内)
- 汉堡:只需要点餐(制作过程不需要知道)
实例:购买一辆电动车
ElectromobileProduct
/**
* @Author: Lanys
* @Description: 材料
* @Date: Create in 21:50 2021/8/5
*/
public class ElectromobileProduct {
/**
* 前轮
*/
private String frontWheel;
/**
* 车身
*/
private String bodyWork;
/**
* 后轮
*/
private String rearWheel;
public void setFrontWheel(String frontWheel) {
this.frontWheel = frontWheel;
}
public void setBodyWork(String bodyWork) {
this.bodyWork = bodyWork;
}
public void setRearWheel(String rearWheel) {
this.rearWheel = rearWheel;
}
@Override
public String toString() {
return "生产一辆电动车前轮["+frontWheel+"]、车身["+bodyWork+"]、后轮["+rearWheel+"]"
}
Build
**
* @Author: Lanys
* @Description: 图纸
* @Date: Create in 21:59 2021/8/5
*/
public abstract class Build {
/**
* 前轮
*/
protected abstract void productionFrontWheel();
/**
* 车身
*/
abstract void productionBodyWork();
/**
* 后轮
*/
abstract void productionRearWheel();
/**
* 产品
*
*/
abstract ElectromobileProduct product();
}
Worker
/**
* @Author: Lanys
* @Description: 工人
* @Date: Create in 22:00 2021/8/5
*/
public class Worker extends Build {
private ElectromobileProduct electromobileProduct;
public Worker(){
this.electromobileProduct = new ElectromobileProduct();
}
/**
* 前轮
*
*/
@Override
public void productionFrontWheel() {
electromobileProduct.setFrontWheel("前轮");
}
/**
* 车身
*
*/
@Override
public void productionBodyWork() {
electromobileProduct.setBodyWork("车身");
}
/**
* 后轮
*
*/
@Override
public void productionRearWheel() {
electromobileProduct.setRearWheel("后轮");
}
/**
* 产品
*
*/
@Override
public ElectromobileProduct product() {
return electromobileProduct;
}
}
Leader
/**
* @Author: Lanys
* @Description: 领导者
* @Date: Create in 22:09 2021/8/5
*/
public class Leader {
public ElectromobileProduct build(Build build){
build.productionFrontWheel();
build.productionBodyWork();
build.productionRearWheel();
return build.product();
}
}
Test
/**
* @Author: Lanys
* @Description:
* @Date: Create in 22:13 2021/8/5
*/
public class Test {
public static void main(String[] args) {
Leader leader = new Leader();
ElectromobileProduct build = leader.build(new Worker());
System.out.println(build.toString());
}
}
电动车的零件是死的,如果我想把电动车改装成自己想要的,应该怎么做?
改装
ElectromobileProduct
/**
* @Author: Lanys
* @Description: 电动车材料
* @Date: Create in 21:50 2021/8/5
*/
public class ElectromobileProduct {
/**
* 前轮
*/
private String frontWheel = "奥迪前轮";
/**
* 车身
*/
private String bodyWork = "地平线车身";
/**
* 后轮
*/
private String rearWheel = "奔驰后轮";
public ElectromobileProduct setFrontWheel(String frontWheel) {
this.frontWheel = frontWheel;
return this;
}
public ElectromobileProduct setBodyWork(String bodyWork) {
this.bodyWork = bodyWork;
return this;
}
public ElectromobileProduct setRearWheel(String rearWheel) {
this.rearWheel = rearWheel;
return this;
}
@Override
public String toString() {
return "ElectromobileProduct{" +
"frontWheel='" + frontWheel + '\'' +
", bodyWork='" + bodyWork + '\'' +
", rearWheel='" + rearWheel + '\'' +
'}';
}
}
Build
/**
* @Author: Lanys
* @Description: 图纸
* @Date: Create in 21:59 2021/8/5
*/
public abstract class Build {
/**
* 前轮
*
* @param data 数据
* @return ElectromobileProduct
*/
abstract ElectromobileProduct productionFrontWheel(String data);
/**
* 车身
*
* @param data 数据
* @return ElectromobileProduct
*/
abstract ElectromobileProduct productionBodyWork(String data);
/**
* 后轮
*
* @param data 数据
* @return ElectromobileProduct
*/
abstract ElectromobileProduct productionRearWheel(String data);
/**
* 产品
*
*/
abstract ElectromobileProduct product();
}
Worker
/**
* @Author: Lanys
* @Description: 工人
* @Date: Create in 22:00 2021/8/5
*/
public class Worker extends Build {
private ElectromobileProduct electromobileProduct;
public Worker(){
this.electromobileProduct = new ElectromobileProduct();
}
/**
* 前轮
*
* @param data 数据
* @return ElectromobileProduct
*/
@Override
Build productionFrontWheel(String data) {
this.electromobileProduct.setFrontWheel(data);
return this;
}
/**
* 车身
*
* @param data 数据
* @return ElectromobileProduct
*/
@Override
Build productionBodyWork(String data) {
this.electromobileProduct.setBodyWork(data);
return this;
}
/**
* 后轮
*
* @param data 数据
* @return ElectromobileProduct
*/
@Override
Build productionRearWheel(String data) {
this.electromobileProduct.setRearWheel(data);
return this;
}
/**
* 产品
*
*/
@Override
ElectromobileProduct product() {
return this.electromobileProduct;
}
}
Test
/**
* @Author: Lanys
* @Description:
* @Date: Create in 22:29 2021/8/5
*/
public class Test {
public static void main(String[] args) {
System.out.println("--------- 改装前 --------");
Worker worker = new Worker();
System.out.println(worker.product().toString());
System.out.println("--------- 改装后 --------");
System.out.println(worker.productionFrontWheel("特斯拉前轮").productionBodyWork("野马后轮").product().toString());
}
}
总结
建造者模式的优点:
- 将产品的建造和表示分离,实现解耦的效果。使用建造者可以使客户端不必知道产品的组成细节。
- 使建造者之间互相独立,有利于系统的扩展,符合开闭原则
缺点:
- 建造者模式创建的产品一般具有较多的共同点,和相似点;如果产品时间差异性很大,使其范围会受到限制。
- 如果产品内部变化复杂,会导致系统变得 很庞大。
应用场景:
- 需要生成的产品对象有共性。
- 隔离复杂的对象创建和使用,并使得相同的创建过程可以使用不同的产品。
- 合适于具有较多的零件(熟属性)产品(对象)的创建过程。