[设计模式]建造者模式

简介


建造者模式 (Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 

建造者模式是一种对象创建型模式可参考 设计模式 创建型模式)。 

使用建造者模式,用户就只需要指定需要建造的类型,具体的建造过程和细节并不需要知道。


结构


图-建造者模式结构图
Product : 产品类,由多个部件构成。
复制代码
class Product {
    List<String> parts = new ArrayList<String>();
    
    public void AddPart(String part) {
        parts.add(part);
    }
    
    public void show() {
        System.out.println("============== 产品创建 ==============");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
复制代码
Builder : 抽象建造者,确定产品由ABC三个部件构成,并声明一个得到产品建造后结果的方法getResult。
interface Builder {
    public void buildPartA();
    public void buildPartB();
    public void buildPartC();
    public Product getResult();
}
ConcreteBuilder : 实现Builder接口中的具体方法。
复制代码
class ConcreteBuilder implements Builder { 
    private Product product = new Product();
    
    @Override
    public void buildPartA() {
        product.AddPart("部件A");
    }

    @Override
    public void buildPartB() {
        product.AddPart("部件B");
    }
    
    @Override
    public void buildPartC() {
        product.AddPart("部件C");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
复制代码
Director : 指挥者类,指挥建造Product的过程(控制构建各部分组件的顺序)。
复制代码
class Director {
    public void construct(Builder builder) {
        builder.buildPartC();
        builder.buildPartA();
        builder.buildPartB();
    }
}
复制代码
Client : 用户并不需要知道具体的建造过程,只需指定建造 Product 具体类型。
复制代码
public class BuilderPattern {
    public static void main(String[] args) {
        Director director = new Director();
        Builder builder = new ConcreteBuilder();
            
        director.construct(builder);
        Product product = builder.getResult();
        product.show();
    }
}
复制代码

运行结果

============== 产品创建 ==============
部件C
部件A
部件B


动机


创建一个复杂对象的算法,这个算法应当独立于对象的组成部分以及它们的装配方式。

构建过程必须允许构建对象时有不同的表示。

 

要点


建造者模式允许修改一个产品的内部表示。

它将构造和表示两块代码隔离开来。

它很好的控制了构建过程。

图-建造者模式时序图

关键流程

客户端创建 Director 对象并配置它所需要的 Builder 对象。
Director 负责通知 builder 何时建造 product 的部件。
Builder处理 director 的请求并添加 product 的部件。
客户端从 builder 处获得 product。

实例


想象一下盖房子的场景。
一栋房子是由地基、墙、屋顶、门、窗各部分组合而成的。
盖房子需要有建筑工人负责建造,有工程师负责画建筑图纸。

House (Product角色)

复制代码
package com.zp.java.patterns.builder;

import java.util.ArrayList;
import java.util.List;

// Product角色,由多个部件构成
public class House {
    List<String> parts = new ArrayList<String>();
    
    public void addPart(String part) {
        parts.add(part);
    }
    
    public void show() {
        System.out.println("======= 房子展示 =======");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
复制代码

Builder

复制代码
package com.zp.java.patterns.builder;

// Builder角色 ,提供构建产品各部件的方法,并提供一个获得完整产品的方法。
public interface Builder {
    public void buildFoundation();
    public void buildWall();
    public void buildRoof();
    public void buildWindow();
    public void buildDoor();
    public House createHouse();
}
复制代码

Worker (ConcreteBuilder角色)

复制代码
package com.zp.java.patterns.builder;

// ConcreteBuilder角色,实现 Builder 接口中的具体方法。 
public class Worker implements Builder {
    private House house = new House();
    
    @Override
    public void buildFoundation() {
        house.addPart("地基");
    }

    @Override
    public void buildWall() {
        house.addPart("墙");
    }

    @Override
    public void buildRoof() {
        house.addPart("房顶");
    }

    @Override
    public void buildWindow() {
        house.addPart("窗户");
    }

    @Override
    public void buildDoor() {
        house.addPart("门");
    }

    @Override
    public House createHouse() {
        return house;
    }
}
复制代码

Engineer (Director角色)

复制代码
package com.zp.java.patterns.builder;

// Director角色,指挥构建产品的过程(控制构建顺序)
public class Engineer {
    public void conduct(Builder builder) {
        builder.buildFoundation();
        builder.buildWall();
        builder.buildRoof();
        builder.buildWindow();
        builder.buildDoor();
    }
}
复制代码

Client

客户无需了解具体的构造细节。

复制代码
package com.zp.java.patterns.builder;

public class Test {
    public static void main(String[] args) {
        Builder builder = new Worker();
        Engineer engineer = new Engineer();
        engineer.conduct(builder);
        House house = builder.createHouse();
        house.show();
    }
}
复制代码

运行结果

======= 房子展示 =======
地基

房顶
窗户

推荐阅读


本文属于 设计模式系列


参考资料


《大话设计模式》

《HeadFirst设计模式》

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   静默虚空  阅读(1144)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示