建造者模式(Builder)
建造者模式(Builder Pattern)
建造者模式很容易让人想到建房子,不管建刚需房、改善房还是别墅,它们都离不开地基、柱子、层面和墙体这些组成部分,建筑工人就是把这些组成部分一个个建起来,最后连成一体建出一栋栋楼房。
来看看建造者模式的定义,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建房子的过程都是相似的,但可以建出形形色色的房子。
使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
- 用户只需要给出指定复杂对象的类型和内容;
- 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
示例图如下:
我们用制造自行车为例子讲解建造者模式,自行车由车架、轮胎、脚踏等部件组成,如下图所示。自行车制造公司就是把这些零部件组装起来
自行车制造公司的工程部门相当于指挥者,生产部门相当于建造者,当今共享单车做的比较大的摩拜和ofo相当于客户,单车就是产品了。结构图如下所示:
一起来看看如何用代码来实现
public class Bike {
// 轮胎
private String tyre;
// 车架
private String frame;
// GPS定位装置
private String gps;
public String getTyre() {
return tyre;
}
public void setTyre(String tyre) {
this.tyre = tyre;
}
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
public String getGps() {
return gps;
}
public void setGps(String gps) {
this.gps = gps;
}
}
public interface BikeBuilder {
// 组装轮胎
public void buildTyres();
// 组装车架
public void buildFrame();
// 组装GPS定位装置
public void buildGPS();
// 获取自行车
public Bike getBike();
}
public class EngineeringDepartment {
// 用户告知指挥者想要什么样的单车
BikeBuilder bikeBuilder;
public EngineeringDepartment(BikeBuilder bikeBuilder){
this.bikeBuilder = bikeBuilder;
}
// 指导组装单车
public void Construct(){
bikeBuilder.buildTyres();
bikeBuilder.buildFrame();
bikeBuilder.buildGPS();
}
}
public class MoBikeBuilder implements BikeBuilder{
// 拥有单车对象
Bike bike = new Bike();
@Override
public void buildTyres() {
bike.setTyre("橙色轮胎");
}
@Override
public void buildFrame() {
bike.setFrame("橙色车架");
}
@Override
public void buildGPS() {
bike.setGps("mobike定制版GPS定位装置");
}
@Override
public Bike getBike() {
return bike;
}
}
public class OfoBikeBuilder implements BikeBuilder{
// 拥有单车对象
Bike bike = new Bike();
@Override
public void buildTyres() {
bike.setTyre("橙色轮胎");
}
@Override
public void buildFrame() {
bike.setFrame("橙色车架");
}
@Override
public void buildGPS() {
bike.setGps("mobike定制版GPS定位装置");
}
@Override
public Bike getBike() {
return bike;
}
}
public class BuilderTest {
public static void main(String[] args) {
// 建造摩拜单车
BikeBuilder moBikeBuilder = new MoBikeBuilder();
EngineeringDepartment ed1 = new EngineeringDepartment(moBikeBuilder);
ed1.Construct();// 指导组装
// 产出单车,体现建造和显示分离
Bike moBike = moBikeBuilder.getBike();
// 建造ofo单车
BikeBuilder ofoBikeBuilder = new MoBikeBuilder();
EngineeringDepartment ed2 = new EngineeringDepartment(ofoBikeBuilder);
ed2.Construct();// 指导组装
Bike ofoBike = ofoBikeBuilder.getBike();
}
}
模式讲解:
1. 指挥者(Director)直接和客户(Client)进行需求沟通;
2. 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
3. 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
4. 各个具体建造者负责进行产品部件的构建;
5. 最终构建成具体产品(Product)。
缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
应用场景
- 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。