设计模式之建造者模式

简介: 建造者模式其实理解起来也是比较容易的。比如工地上建房子,对于我们用户来说不需要知道房子是如何建造的,到时候我们只需要去购买就好了,对于开发商来说他只需要指挥下面的无数个包工头去建造就好了,对于包工头他就要知道知道房子的每一个细节,确保万无一失。其实这就是建造者模式,它把创建对象的一些复杂过程(建造衣服)给封装了起来,我们程序员想要new一个新的对象,只需要说出自己条件就好了。

一、认识建造者模式


上面的例子如果你有点懵,没关系下面好好地理一理。使用一张图来表示一下建造者模式

v2-b1df4e1144e7634c88743ff17f6d0953_1440w.jpg上面的流程梳理一下,一共有5个角色


(1)用户:也就是我们消费者,用户提要求,要建一个什么样的房子

(2)Director(开发商):他自己不会开发,就像万达老板一样可能不会砌墙这些,但是他找包工头去做,他只需要去调用这些包工头就造房子就好了。

(3)Builder(抽象的包工头):给出一个抽象接口,规定房子由哪几部分组成,如何去建造。给下面的包工头一个建房子的规范。

(4)ContreteBuilder(具体包工头):真正建房子的人,但是每一个包工头可以建不同的房子。

(5)Product(房子):也就是我们的产品类。

再给出一张类图看一下他们几个在类上的关系

v2-b808c6561f48a756cc9f12118560c575_1440w.jpg

明白了吧。如果还不清楚,在往下看,代码去演示一下。


二、代码实现建造者模式


我们代码实现的时候,是从后往前走的,比如说是先有房子然后建造者这些。


第一步:定义Product(房子)


//角色:产品类房子
public class House {
    private String bedroom;//卧室
    private String kitchen;//厨房
    private String toilet;//厕所
    //getter和setter方法
    //toString方法
}


第二步:抽象建造者接口


//角色:包工头
public interface IBuilder {
    public  void buildBedroom();//建卧室
    public  void buildKitchen();//建厨房
    public  void buildToilet();//建厕所
    House retrieveResult();
}


第三步:具体建造者(这里有两个包工头A和B)


包工头B和A是一样的代码。只是名字不同,这里就给出一个

//角色:具体建造者(包工头A)
public class HouseBuilderA implements IBuilder {
    //先有一个空壳子,卧室厨房厕所都没有
    private House house = new House();
    //开始建造卧室
    @Override
    public void buildBedroom() {
        house.setBedroom("包工头A:卧室建造成功");
    }
    //开始建造卧室
    @Override
    public void buildKitchen() {
        house.setKitchen("包工头A:厨房建造成功");
    }
    //开始建造卧室
    @Override
    public void buildToilet() {
        house.setToilet("包工头A:厕所建造成功");
    }
    //房子建好了,直接返回
    @Override
    public House retrieveResult() {
        return house;
    }
}


第四步:Director(开发商指挥者)


//角色:director(开发商)
public class Developer {
    //有一个包工头:具体是哪一个我不知道
    private IBuilder builder;
    //让包工头受开发商管理
    public Developer(IBuilder builder) {
        this.builder = builder;
    }
    //开发商一声令下,包工头开始造房子
    public void construct(){
        builder.buildBedroom();
        builder.buildKitchen();
        builder.buildToilet();
    }
}


第五步:用户


//角色:用户
public class User {
    public static void main(String[] args) {
        //创建包工头
        IBuilder builderA = new HouseBuilderA();
        IBuilder builderB = new HouseBuilderB();
        //创造开发商角色,给定建造者对象:A或者B
        Developer director = new Developer(builderA);
        director.construct();
        //制造完成:出来一个房子
        House productA = builderA.retrieveResult();
        System.out.println(productA.toString());
    }
}


三、总结


(1)优点

  • 将产品本身与产品创建过程进行解耦,
  • 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
  • 增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。

(2)缺点

  • 如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

OK,建造者模式就先讲到这里,如有问题还请批评指正。

相关文章
|
2月前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
112 1
|
2月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
|
2月前
|
设计模式 Java 机器人
Java设计模式-建造者模式
建造者(Builder)模式指将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。它是把对象的构建和表述分离。
62 0
Java设计模式-建造者模式
|
5天前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
7 1
|
2天前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
4天前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)
|
4天前
|
设计模式 Java
Java设计模式之建造者模式详解
Java设计模式之建造者模式详解
|
4天前
|
设计模式 Java
设计模式之建造者模式
设计模式之建造者模式
|
2月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
23 1
大话设计模式(3)——造物者一般的建造者模式
|
10天前
|
设计模式
创建型设计模式之建造者模式
创建型设计模式之建造者模式