网络营销的网站定位,做网站后台运营这个工作怎么样,南京手机网站设计公司,关键词排名优化网站建设公司建造者模式#xff08;Builder Pattern#xff09;学习笔记
1. 模式定义
建造者模式是一种创建型设计模式#xff0c;通过分步构建复杂对象的方式#xff0c;将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。
2. 适用场景
✅ 需要创建包含多个…建造者模式Builder Pattern学习笔记
1. 模式定义
建造者模式是一种创建型设计模式通过分步构建复杂对象的方式将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。
2. 适用场景
✅ 需要创建包含多个部件的复杂对象 ✅ 需要控制对象的创建过程分步骤构建 ✅ 需要构建不同表示的对象相同构建过程不同实现 ✅ 希望避免构造器参数过多解决伸缩构造函数问题
3. 模式结构 #mermaid-svg-W2K934V0KatnSv3j {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W2K934V0KatnSv3j .error-icon{fill:#552222;}#mermaid-svg-W2K934V0KatnSv3j .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-W2K934V0KatnSv3j .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-W2K934V0KatnSv3j .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-W2K934V0KatnSv3j .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-W2K934V0KatnSv3j .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-W2K934V0KatnSv3j .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-W2K934V0KatnSv3j .marker{fill:#333333;stroke:#333333;}#mermaid-svg-W2K934V0KatnSv3j .marker.cross{stroke:#333333;}#mermaid-svg-W2K934V0KatnSv3j svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-W2K934V0KatnSv3j g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-W2K934V0KatnSv3j g.classGroup text .title{font-weight:bolder;}#mermaid-svg-W2K934V0KatnSv3j .nodeLabel,#mermaid-svg-W2K934V0KatnSv3j .edgeLabel{color:#131300;}#mermaid-svg-W2K934V0KatnSv3j .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-W2K934V0KatnSv3j .label text{fill:#131300;}#mermaid-svg-W2K934V0KatnSv3j .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-W2K934V0KatnSv3j .classTitle{font-weight:bolder;}#mermaid-svg-W2K934V0KatnSv3j .node rect,#mermaid-svg-W2K934V0KatnSv3j .node circle,#mermaid-svg-W2K934V0KatnSv3j .node ellipse,#mermaid-svg-W2K934V0KatnSv3j .node polygon,#mermaid-svg-W2K934V0KatnSv3j .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-W2K934V0KatnSv3j .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-W2K934V0KatnSv3j g.clickable{cursor:pointer;}#mermaid-svg-W2K934V0KatnSv3j g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-W2K934V0KatnSv3j g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-W2K934V0KatnSv3j .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-W2K934V0KatnSv3j .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-W2K934V0KatnSv3j .dashed-line{stroke-dasharray:3;}#mermaid-svg-W2K934V0KatnSv3j #compositionStart,#mermaid-svg-W2K934V0KatnSv3j .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j #compositionEnd,#mermaid-svg-W2K934V0KatnSv3j .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j #dependencyStart,#mermaid-svg-W2K934V0KatnSv3j .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j #dependencyStart,#mermaid-svg-W2K934V0KatnSv3j .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j #extensionStart,#mermaid-svg-W2K934V0KatnSv3j .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j #extensionEnd,#mermaid-svg-W2K934V0KatnSv3j .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j #aggregationStart,#mermaid-svg-W2K934V0KatnSv3j .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j #aggregationEnd,#mermaid-svg-W2K934V0KatnSv3j .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-W2K934V0KatnSv3j .edgeTerminals{font-size:11px;}#mermaid-svg-W2K934V0KatnSv3j :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Director -builder: Builder construct() «interface» Builder buildPartA() buildPartB() getResult() ConcreteBuilder -product: Product buildPartA() buildPartB() getResult() Product partA partB show() 4. 核心角色
角色说明Director指挥者控制构建过程非必须Builder抽象建造者定义构建步骤的接口ConcreteBuilder具体建造者实现构建步骤并返回产品Product最终构建的复杂对象
5. 代码示例
5.1 产品类
public class Computer {private String cpu;private String ram;private String storage;// 构造函数、getters、toString...
}5.2 抽象建造者
public interface ComputerBuilder {void buildCPU();void buildRAM();void buildStorage();Computer getResult();
}5.3 具体建造者
public class GamingComputerBuilder implements ComputerBuilder {private Computer computer new Computer();Overridepublic void buildCPU() {computer.setCpu(Intel i9-13900K);}Overridepublic void buildRAM() {computer.setRam(64GB DDR5);}Overridepublic void buildStorage() {computer.setStorage(2TB NVMe SSD);}Overridepublic Computer getResult() {return computer;}
}5.4 指挥者可选
public class Director {private ComputerBuilder builder;public Director(ComputerBuilder builder) {this.builder builder;}public Computer construct() {builder.buildCPU();builder.buildRAM();builder.buildStorage();return builder.getResult();}
}5.5 客户端调用
public class Client {public static void main(String[] args) {ComputerBuilder builder new GamingComputerBuilder();Director director new Director(builder);Computer computer director.construct();// 或直接使用建造者ComputerBuilder builder2 new OfficeComputerBuilder();builder2.buildCPU();builder2.buildRAM();Computer simpleComputer builder2.getResult();}
}6. 模式变种
链式调用版
public class Computer {// 使用静态内部类实现public static class Builder {private String cpu;private String ram;public Builder withCPU(String cpu) {this.cpu cpu;return this;}public Builder withRAM(String ram) {this.ram ram;return this;}public Computer build() {return new Computer(this);}}
}
// 使用new Computer.Builder().withCPU(i7).withRAM(16GB).build();7. 优缺点分析
✔️ 优点
分离构建过程和表示更好的控制构建过程方便扩展新的产品类型避免过多构造函数参数
❌ 缺点
增加代码复杂度产品需要高度相似才适用对简单对象的创建可能显得冗余
8. 相关模式对比
模式关注点复杂度使用场景工厂模式对象整体创建低创建单一类型对象抽象工厂模式产品族的创建高创建相关对象家族建造者模式分步构建复杂对象中需要分步骤构建的复杂对象
9. 实际应用案例
Java中的StringBuilderSpring中的BeanDefinitionBuilderLombok的Builder注解实现Android中的AlertDialog.Builder
10. 最佳实践建议
当构造器参数超过4个时考虑使用需要创建不可变对象时优先使用使用链式调用增强可读性当构建顺序重要时一定要保留Director角色 记忆技巧把建造者模式想象成分步填表的过程最后提交表格生成完整对象。