设计模式使用场景实现示例及优缺点(创建型模式——建造者模式)

在一个遥远的国度,有一个名叫“构建城”的地方。在这个城里,住着一位著名的建筑师,他的名字叫阿尔法。阿尔法以其独特的建筑风格和高超的技艺而闻名于世,但他最为人称道的,是他发明了一种神奇的“建造者模式”。

阿尔法的建造者模式就像一把钥匙,可以打开创造复杂建筑的无限可能。他相信,建筑不应只是简单的堆砌砖瓦,而是要通过细致入微的步骤,逐渐形成美丽的作品。于是,他决定用这种模式来建造一座宏伟的城堡。

首先,阿尔法为城堡设计了一个蓝图,蓝图上详细列出了城堡的各个部分:高耸的塔楼、宽敞的大厅、精致的花园和坚固的围墙。他把每个部分都当作一个独立的“建筑组件”,这样可以让每个部分在构建时都有自己的特点和风格。

接下来,阿尔法开始分步骤进行建造。首先,他找来了工匠们,告诉他们:“我们先来建造城堡的基础。”工匠们按照阿尔法的指示,打下了坚实的基础。然后,他们继续建造围墙,确保城堡的安全。每完成一个部分,阿尔法都会仔细检查,并根据需要进行调整。

随着时间的推移,城堡的各个部分逐渐成型。高耸的塔楼在阳光下闪烁着金光,宽敞的大厅里悬挂着华丽的吊灯,精致的花园中开满了五彩斑斓的花朵。这一切都在阿尔法的精心构思下,变得生动而美丽。

最终,经过数月的努力,城堡终于完工了。阿尔法站在城堡的最高处,俯瞰着自己亲手建造的宏伟建筑,心中充满了自豪。他知道,这不仅仅是一座城堡,更是一种理念:通过分步骤的方式,细致地构建每一个部分,才能创造出真正的艺术品。

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象。通过将一个复杂对象的构造代码从其表示中分离出来,建造者模式可以让你通过细化各个部分的构造步骤来创建一个复杂对象。

适用场景

  1. 需要生成的对象有复杂的内部结构

    • 对象的创建过程包含多个步骤或多个部件的创建。
  2. 同样的创建过程需要生成不同的表示

    • 一个构建过程可以创建多个不同类型的对象。
  3. 客户端代码不希望直接控制对象的创建过程

    • 客户端代码只需要一个构建器来控制创建的细节。

实现示例(Java)

以下是一个简单的建造者模式的实现示例,展示如何创建不同类型的房子(如石头房子和木头房子)。

1. 产品类
public class House {
    private String foundation;
    private String structure;
    private String roof;
    private String interior;

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

    public void setStructure(String structure) {
        this.structure = structure;
    }

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

    public void setInterior(String interior) {
        this.interior = interior;
    }

    @Override
    public String toString() {
        return "House [foundation=" + foundation + ", structure=" + structure + ", roof=" + roof + ", interior=" + interior + "]";
    }
}
2. 抽象建造者类
public abstract class HouseBuilder {
    protected House house;

    public House getHouse() {
        return house;
    }

    public void createNewHouse() {
        house = new House();
    }

    public abstract void buildFoundation();
    public abstract void buildStructure();
    public abstract void buildRoof();
    public abstract void buildInterior();
}
3. 具体建造者类
public class StoneHouseBuilder extends HouseBuilder {
    @Override
    public void buildFoundation() {
        house.setFoundation("Stone foundation");
    }

    @Override
    public void buildStructure() {
        house.setStructure("Stone walls");
    }

    @Override
    public void buildRoof() {
        house.setRoof("Stone roof");
    }

    @Override
    public void buildInterior() {
        house.setInterior("Stone interior");
    }
}

public class WoodenHouseBuilder extends HouseBuilder {
    @Override
    public void buildFoundation() {
        house.setFoundation("Wooden foundation");
    }

    @Override
    public void buildStructure() {
        house.setStructure("Wooden walls");
    }

    @Override
    public void buildRoof() {
        house.setRoof("Wooden roof");
    }

    @Override
    public void buildInterior() {
        house.setInterior("Wooden interior");
    }
}
4. 指挥者类
public class Director {
    private HouseBuilder houseBuilder;

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

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

    public void constructHouse() {
        houseBuilder.createNewHouse();
        houseBuilder.buildFoundation();
        houseBuilder.buildStructure();
        houseBuilder.buildRoof();
        houseBuilder.buildInterior();
    }
}
5. 客户端代码
public class Client {
    public static void main(String[] args) {
        Director director = new Director();

        // 建造石头房子
        HouseBuilder stoneHouseBuilder = new StoneHouseBuilder();
        director.setHouseBuilder(stoneHouseBuilder);
        director.constructHouse();
        House stoneHouse = director.getHouse();
        System.out.println("House built:\n" + stoneHouse);

        // 建造木头房子
        HouseBuilder woodenHouseBuilder = new WoodenHouseBuilder();
        director.setHouseBuilder(woodenHouseBuilder);
        director.constructHouse();
        House woodenHouse = director.getHouse();
        System.out.println("House built:\n" + woodenHouse);
    }
}

注释说明

  1. 产品类

    • House 类表示一个复杂对象。它有多个部件(如基础、结构、屋顶和内部装饰)。
  2. 抽象建造者类

    • HouseBuilder 是一个抽象类,定义了构建 House 对象的各个步骤(如 buildFoundationbuildStructure 等)。
  3. 具体建造者类

    • StoneHouseBuilderWoodenHouseBuilder 是具体的建造者类,实现了抽象建造者类的方法,具体定义了如何构建 House 的各个部件。
  4. 指挥者类

    • Director 类负责管理建造过程。它通过调用 HouseBuilder 的方法来一步步构建 House 对象。
  5. 客户端代码

    • Client 类通过 Director 类来构建不同类型的房子。客户端代码不需要直接控制对象的创建过程,只需要使用 Director 来管理建造者。

总结

建造者模式通过将复杂对象的构建过程分离出来,使得客户端代码可以灵活地构建不同类型的对象。它适用于需要构建复杂对象的场景,尤其是当对象的创建过程包含多个步骤或多个部件时。建造者模式可以提高代码的可读性和可维护性。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值