设计模式之建造者模式【用好玩的故事讲清楚设计模式】
积千里跬步,汇万里江河;每天进步一点点,终有一天将成大佬
所有源代码都在这:https://github.com/z573419235/GofDemo
各位大佬记得点个星星哦
前言
建造者模式用于实例化一个比较复杂的实体类,当你实例化一个类时,它的构造参数比较多时,就可以用建造者模式来简化实例化过程;前几篇工厂模式的文章我们说道买车,那只是简单的区工厂买车,我们不关系工厂是怎么造出来的.可是实际工厂造一辆车需要有方向盘、发动机、车架、轮胎等部件,而且不同品牌的车的部件都是不同的,部件虽然不同,但是造车的方式基本都是差不多的步骤,这时候就可以用建造者模式来造一辆车了;
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成
土豪朋友开车厂
土豪朋友上次买了车之后,发现造车卖还挺赚钱,于是决定涉足汽车领域,真是很有商业头脑啊,不愧是我的玉树临风,疯言疯语,语速惊人,人模狗样的土豪朋友啊.
一天,前去向他讨教汽车的知识,他给我讲了汽车的大致构成:
/**
* 汽车 产品类 定义汽车的构成
* */
@Data
public class Car {
/**
* 方向盘
* */
private String steering;
/**
* 发动机
* */
private String engine;
/**
* 车架
* */
private String frame;
/**
* 轮胎
* */
private String tire;
/**
* 展示一下汽车配置
* */
public String show() {
return "{" +
"steering='" + steering + '\'' +
", engine='" + engine + '\'' +
", frame='" + frame + '\'' +
", tire='" + tire + '\'' +
'}';
}
}
果真是大致啊,忽悠我不懂车是吧,就给我讲4个东西,这谁不知道啊,哼!土豪朋友忙解释到:这不是为了通俗易懂嘛!!哈哈哈—土豪朋友尴尬而不失礼貌的笑着!
算了算了,不和你计较了,你再和我讲下你们车厂的造车模式吧!!他说,一开始他造车自己累的半死,什么都要亲力亲为,后来招了两个专家,一个负责宝马的制造,一个负责奔驰的制造,我现在要什么车,只要指挥谁造车就好了.轻松的很;
他给我介绍了一下他的两个专家:
/**
* 宝马车建造者
* */
public class BMWBuilder extends AbstractBuild {
@Override
void buildEngine() {
car.setEngine("宝马的发动机");
}
@Override
void buildSteering() {
car.setSteering("宝马的方向盘");
}
@Override
void buildFrame() {
car.setFrame("宝马的车架");
}
@Override
void buildTire() {
car.setTire("宝马的轮胎");
}
}
/**
* 奔驰车建造者
* */
public class BenzBuilder extends AbstractBuild {
@Override
void buildEngine() {
car.setEngine("奔驰的发动机");
}
@Override
void buildSteering() {
car.setSteering("奔驰的方向盘");
}
@Override
void buildFrame() {
car.setFrame("奔驰的车架");
}
@Override
void buildTire() {
car.setTire("奔驰的轮胎");
}
}
他们两个都遵循下面这个AbstractBuild
汽车的建造规则:
/**
* 抽象建造者 定义造车的方法
* */
abstract class AbstractBuild {
/**
* 造的产品是车
* */
protected Car car=new Car();
/**
* 造发动机
* */
abstract void buildEngine();
/**
* 造轮胎
* */
abstract void buildSteering();
/**
* 造车架
* */
abstract void buildFrame();
/**
* 造轮胎
* */
abstract void buildTire();
/**
* 得到造好的车
* */
public Car getCar(){
return this.car;
}
}
土豪朋友还跟我讲了是怎么指挥他们造车的:
/**
* 所有的建造者要听这个包工头的话,叫你造什么就造什么
* */
public class Boss {
public static Car builderCar(AbstractBuild build){
build.buildEngine();
build.buildFrame();
build.buildSteering();
build.buildTire();
return build.getCar();
}
}
经过他这一翻显摆之后,感觉虽然长的人摸狗样的,干起事来还真是一套一套的,哈哈哈哈!!
说完,还向我展示了汽车是怎样造成的………..
总结
其实建造者模式和工厂模式还是挺像的,建造者模式里的建造者就相当于工厂模式里的工厂,不过建造者的核心是可以控制顺序,比如上面的土豪老板可以控制建造工人的建造顺序,可以控制他们是先造轮胎还是先造发动机,这才是建造者模式意义;
建造者模式如果和模板方法模式搭配起来,建造工人那个类封装一个模板方法开放给老板,老板就可以直接控制这个类就可以了,那这就和工厂模式没什么两样了