建造者模式
定义
将一个复杂对象的构造与它的表示分离开,使同样的构建过程可以创建不同的表示。
它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建成最终的对象。它将变与不变分离开,即产品的组合不变,但每一部分可以灵活的选择。
和工厂方法模式的区别
建造者模式注重零部件的组装过程,工厂方法模式更注重零部件的创建过程,两者可以结合使用。
1、建造者模式更注重方法的调用顺序,工厂模式注重创建对象;
2、创建对象的力度不同,建造者模式创建的是复杂的对象,由各种复杂的部件构成,工厂模式创建出来的对象都是一样的;
3、关注点不一样,工厂模式只需要将对象创建出来就可以了,建造者模式不仅要创建出对象还要知道对象是由哪些部件构成的;
4、建造者模式根据建造过程中的顺序不一样,最终对象部件的组成也不一样。
架构
产品、抽象建造者、具体建造者、指挥者
代码
AbstractBuilder
/**
*
* Description:
* 抽象建造者
* @author: mushi
* @Date: 2021/2/5 10:18
*/
public interface AbstractBuilder {
void buildPartA();
void buildPartB();
void buildPartC();
/**拼接*/
Product splice();
}
Builder
**
*
* Description:
* 具体建造者
* @author: mushi
* @Date: 2021/2/5 10:24
*/
public class Builder implements AbstractBuilder {
private Product product = new Product();
@Override
public void buildPartA() {
System.out.println(this.getClass().getSimpleName()+"/buildPartA()拼接A");
product.setPartA("A");
}
@Override
public void buildPartB() {
System.out.println(this.getClass().getSimpleName()+"/buildPartB()拼接B");
product.setPartB("B");
}
@Override
public void buildPartC() {
System.out.println(this.getClass().getSimpleName()+"/buildPartC()拼接C");
product.setPartC("C");
}
/**
* 拼接
*/
@Override
public Product splice() {
return product;
}
}
Director
/**
*
* Description:
* 指挥者,指挥生产者组装产品
* @author: mushi
* @Date: 2021/2/5 10:34
*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
/**产品创建和组装*/
public Product construct(){
System.out.println(this.getClass().getSimpleName()+"/construst()调用Builder创建产品并组装");
this.builder.buildPartA();
this.builder.buildPartB();
this.builder.buildPartC();
return builder.splice();
}
}
Product
/**
*
* Description:
* 产品
* @author: mushi
* @Date: 2021/2/5 10:15
*/
public class Product {
private String partA;
private String partB;
private String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
@Override
public String toString() {
return "Product{" +
"partA='" + partA + '\'' +
", partB='" + partB + '\'' +
", partC='" + partC + '\'' +
'}';
}
}
Test
public class Test {
public static void main(String[] args) {
//生产产品
Director director = new Director(new Builder());
//组装产品
Product construct = director.construct();
System.out.println("生产的产品是:"+construct.toString());
}
}
总结
看完代码之后其实不难发现就是给一个对象进行初始化的模式,但是如果一个对象里有非常多的属性,或者嵌套的很多的对象,那么你在初始化这个对象的时候可能就要去先了解对象当中有些什么属性然后根据业务逻辑去初始化这个非常复杂的对象,这种情况下使用这种模式的话,你只需要知道自己要得到一个包含哪些数据的对象,然后告诉指挥者,让指挥者去指挥建造者创建这么一个对象就可以了。
就像你有一套刚买的房子需要装修,这个时候你不知道装修房子需要哪些建材或者说要装修哪些东西,这个时候你去找装修公司,告诉了装修公司你想要将房子装修成什么风格的,然后装修公司告诉他们装修团队中的工人要将房子具体装修成你想要的样子,最后就交给工人们去装修,装修结束之后你就得到你想要的新家了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南