建造者模式

建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。这种模式将对象的构造与表示分离,使得相同的构造过程可以产生不同的表示。建造者模式适用于创建对象需要多个步骤,并且这些步骤的顺序可能不同的情况。

主要角色

  1. 产品(Product):需要构建的复杂对象。
  2. 建造者(Builder):一个接口,定义了构建产品各个部件的方法。
  3. 具体建造者(Concrete Builder):实现建造者接口,定义并明确它们构建的产品部件。
  4. 导演(Director):构建一个使用建造者接口的对象,指导构建过程。
  5. 客户端(Client):创建导演对象,并使用它来构建所需的产品对象。

优缺点

优点

  1. 封装性好:客户端不需要知道产品内部组成的细节。
  2. 扩展性好:可以很容易地增加新的具体建造者。
  3. 便于控制细节风险:由于建造者是独立的,因此改变一个建造者对其他建造者没有影响。

缺点

  1. 产品必须有共同点:如果产品之间没有共同点,则不适合使用建造者模式。
  2. 内部结构复杂:如果产品的内部结构过于复杂,可能会导致系统中类的数量增加。

实例

假设我们要构建一个房屋,房屋有不同的部分,如地基、墙壁、屋顶等。我们可以使用建造者模式来构建这个房屋。

java 复制代码
// 产品
class House {
    private String foundation;
    private String walls;
    private String roof;

    public void setFoundation(String foundation) {
        this.foundation = foundation;
    }

    public void setWalls(String walls) {
        this.walls = walls;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }
}

// 建造者接口
interface HouseBuilder {
    void buildFoundation();
    void buildWalls();
    void buildRoof();
    House getHouse();
}

// 具体建造者
class ConcreteHouseBuilder implements HouseBuilder {
    private House house;

    public ConcreteHouseBuilder() {
        house = new House();
    }

    public void buildFoundation() {
        house.setFoundation("混凝土基础");
    }

    public void buildWalls() {
        house.setWalls("砖墙");
    }

    public void buildRoof() {
        house.setRoof("瓦屋顶");
    }

    public House getHouse() {
        return house;
    }
}

// 导演
class HouseDirector {
    private HouseBuilder houseBuilder;

    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public void constructHouse() {
        houseBuilder.buildFoundation();
        houseBuilder.buildWalls();
        houseBuilder.buildRoof();
    }

    public House getHouse() {
        return houseBuilder.getHouse();
    }
}

// 客户端
public class BuilderPatternDemo {
    public static void main(String[] args) {
        HouseBuilder houseBuilder = new ConcreteHouseBuilder();
        HouseDirector houseDirector = new HouseDirector(houseBuilder);
        houseDirector.constructHouse();
        House house = houseDirector.getHouse();
        System.out.println("房屋建造完成:" + house.toString());
    }
}

在这个例子中,我们定义了一个房屋类(House),一个建造者接口(HouseBuilder),一个具体建造者类(ConcreteHouseBuilder),一个导演类(HouseDirector)以及一个客户端类(BuilderPatternDemo)。客户端通过导演类和具体建造者类来构建房屋对象。

相关推荐
编啊编程啊程1 小时前
JUC之AQS
java·开发语言·jvm·c++·kafka
好学且牛逼的马4 小时前
GOLANG 接口
开发语言·golang
ahauedu4 小时前
AI资深 Java 研发专家系统解析Java 中常见的 Queue实现类
java·开发语言·中间件
韭菜钟4 小时前
在Qt中用cmake实现类似pri文件的功能
开发语言·qt·系统架构
闲人编程4 小时前
Python第三方库IPFS-API使用详解:构建去中心化应用的完整指南
开发语言·python·去中心化·内存·寻址·存储·ipfs
CTRA王大大5 小时前
【golang】制作linux环境+golang的Dockerfile | 如何下载golang镜像源
linux·开发语言·docker·golang
zhangfeng11336 小时前
以下是基于图论的归一化切割(Normalized Cut)图像分割工具的完整实现,结合Tkinter界面设计及Python代码示
开发语言·python·图论
还梦呦7 小时前
2025年09月计算机二级Java选择题每日一练——第五期
java·开发语言·计算机二级
鱼鱼说测试8 小时前
postman接口自动化测试
开发语言·lua
從南走到北8 小时前
JAVA国际版东郊到家同城按摩服务美容美发私教到店服务系统源码支持Android+IOS+H5
android·java·开发语言·ios·微信·微信小程序·小程序