前言
我们可以通过
new
创建一个对象,并且可以通过定义不同参数的构造方法,实现创建出不同的对象的效果,但是这种做法的后果就是,随着业务复杂,构造方法会越来越多,参数的个数也会越来越多,导致最后维护困难,理解难度加大,利用建造者模式就可以解决这个问题。
定义
将一个复杂对象的构造与表示分离,同样的构建过程可以创建出不同的表示。
将一个复杂对象拆分成多个简单对象,然后通过组合拼成一个完整对象表示,简单对象可以灵活选择,最终导致相同的构建过程,创建出的表示会根据意愿表示出各种不同结果
优点
- 封装性好,构建和表示分离
- 解耦
- 建造者对创建过程细化,客户端不必知道产品内部组成细节
缺点
- 产品的组成部分必须相同
- 如果产品内部发生变化,建造者也要同步修改,维护成本大
笼统的来看,好像工厂模式也是将对象的创建抽离出去,但是建造者(Builder)模式和工厂模式的关注点确有着极大的不同:建造者模式注重零部件的组装过程,而工厂模式更注重零部件的创建过程,但两者可以结合使用。
图解
实现
复杂产品对象:Iphone
包含多个组成部件的复杂对象
@Data
public class Iphone {
private Battery battery;//电池
private Screen screen; //显示屏
/*显示产品特性*/
public void show() {
battery.print();
screen.print();
System.out.println("iphone组装完成");
}
}
组成部件A:具体产品:Battery
public class Battery {
public void print() {
System.out.println("电池生产完成");
}
}
组成部件B:具体产品:Screen
public class Screen {
public void print() {
System.out.println("显示屏生产完成");
}
}
抽象建造者:Builder
包含多个部件的抽象创建方法,通常还有一个返回复杂对象的具体方法
abstract class Builder {
//创建产品对象
protected Iphone iphone = new Iphone();
public abstract void buildBattery();
public abstract void buildScreen();
//返回产品
public Iphone getResult(){
return iphone;
}
}
具体建造者: BuilderImpl
完成复杂部件的各个组成部件的具体创建方法
//具体建造者:实现了抽象建造者接口。
public class BuilderImpl extends Builder {
@Override
public void buildBattery() {
iphone.setBattery(new Battery());
}
@Override
public void buildScreen() {
iphone.setScreen(new Screen());
}
}
指挥者:Director
规定具体的生产组装方式
public class Director {
private final Builder builder;
public Director(Builder builder){
this.builder = builder;
}
//产品组装方法
public Iphone construct(){
builder.buildBattery();
builder.buildScreen();
return builder.getResult();
}
}
客户端:
public class Client {
public static void main(String[] args) {
Builder builder = new BuilderImpl();
Director director = new Director(builder);
Iphone iphone = director.construct();
iphone.show();
}
}
打印输出
电池生产完成
显示屏生产完成
iphone组装完成
说明
- 当需要生产一个
Iphone
时,客户端(Client
)直接和指挥者(Director
)进行需求沟通;- 通后
Director
将生产Iphone
的需求分发给各个部件的建造者(Builder
);- 各个部件的建造请求委派到具体的建造者(
BuilderImpl
);- 各个具体建造者负责进行产品部件的构建;
- 最终构构建成一个完整的
Iphone
。
构建具体部件的时候可以结合工厂模式,生产出不同厂家的部件,最后得到不同配置的
Iphone
,这里感兴趣的朋友可以自己去实现一下。
总结
- 工作中,如果我们需要将一个复杂对象的构建与它的表示分离或者遇到多个构造器参数时要学会使用建造者模式。
- 建造者模式更加注重的是对象创建的顺序,一个复杂对象通过不同的组装顺序,最终的表现也不一样,工厂模式注重的是对象的创建,创建出来的对象都一样。
如果这篇文章对您有帮助,非常欢迎您点赞支持!这不仅是对我工作的认可,也能鼓励我继续创作更多有价值的内容。感谢您的支持和反馈,希望未来还能为您提供更多有益的信息和灵感。