【Java 设计模式】创建型之建造者模式

发布时间:2024年01月17日

在软件开发中,建造者模式是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常包括一个指导者(Director)类和多个建造者(Builder)类,指导者负责组织建造者的构建过程,而建造者负责具体的构建步骤。在本文中,我们将介绍 Java 设计模式中的建造者模式,了解其定义、使用场景以及如何在实际开发中应用。

1. 定义

建造者模式是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式的核心思想是将一个复杂对象的构建过程封装在一个指导者类中,由多个建造者类负责具体的构建步骤。客户端通过指导者类调用建造者的方法来完成对象的构建。

2. 应用场景

建造者模式的应用场景包括但不限于以下情况:

  • 构建复杂对象:

    当一个对象的构建过程比较复杂,涉及到多个步骤或者需要进行多次配置时,可以使用建造者模式将构建过程分解成多个步骤

  • 创建不同表示:

    当需要创建不同表示的对象时,可以使用相同的构建过程,但由不同的建造者类负责实际的构建

  • 避免构造器参数过多:

    当一个类的构造器参数过多,导致构造器方法签名冗长,可以使用建造者模式将参数分解到不同的建造者方法中,提高代码的可读性

3. 代码实现

建造者模式的实现主要涉及以下几个角色:

在这里插入图片描述

  • 产品类(Product): 定义了要构建的复杂对象
  • 抽象建造者接口(Builder): 定义了构建复杂对象的抽象方法,包括设置对象的各个部分
  • 具体建造者类(ConcreteBuilder): 实现了抽象建造者接口,负责具体的构建步骤,通常包括设置对象的属性、组装部件等
  • 指导者类(Director): 负责组织建造者的构建过程,按照一定的顺序调用建造者的方法来构建对象

下面是一个简单的建造者模式的实现示例:

1)创建一个产品类 Product,拥有着自己的属性,此处拥有 attribute1 和 attribute2

Product.java

package com.cheney.demo;

class Product {
    private final String attribute1;
    private final String attribute2;

    public Product(String attribute1, String attribute2) {
        this.attribute1 = attribute1;
        this.attribute2 = attribute2;
    }

    public String getAttribute1() {
        return attribute1;
    }

    public String getAttribute2() {
        return attribute2;
    }

    public void display() {
        System.out.println("Product: " + attribute1 + " " + attribute2);
    }
}

2)创建建造者接口 Builder 及它的实现类 ProductBuilder

Builder.java

package com.cheney.demo;

interface Builder {
    void buildAttribute1(String buildAttribute1);
    void buildAttribute2(String buildAttribute2);
    Product getResult();
}

ProductBuilder.java

package com.cheney.demo;

class ProductBuilder implements Builder {
    private Product product;

    public ProductBuilder() {
        this.product = new Product("", "");
    }

    @Override
    public void buildAttribute1(String attribute1) {
        product = new Product(attribute1, product.getAttribute2());
    }

    @Override
    public void buildAttribute2(String attribute2) {
        product = new Product(product.getAttribute1(), attribute2);
    }

    @Override
    public Product getResult() {
        return product;
    }
}

3)创建一个导者类 ProductDirector

ProductDirector.java

package com.cheney.demo;

public class ProductDirector {
    private final ProductBuilder productBuilder;

    public ProductDirector(ProductBuilder productBuilder) {
        this.productBuilder = productBuilder;
    }

    public void construct() {
        productBuilder.buildAttribute1("1");
        productBuilder.buildAttribute2("cheney");
    }
}

在上述示例中,Product 是产品类,定义了要构建的复杂对象。Builder 是抽象建造者接口,定义了构建复杂对象的抽象方法。ProductBuilder 是具体建造者类,实现了抽象建造者接口,负责具体的构建步骤。ProductDirector 是指导者类,负责组织建造者的构建过程。

4. 应用示例

假设我们想吃汉堡,需要制作一个汉堡包。汉堡包包括面包和肉等属性。我们可以使用建造者模式来制作汉堡包

1)创建一个汉堡包产品类,拥有着自己的属性

Hamburger.java

package com.cheney.demo;

public class Hamburger {
    private final String bread;
    private final String meat;

    public Hamburger(String bread, String meat) {
        this.bread = bread;
        this.meat = meat;
    }

    public String getBread() {
        return bread;
    }

    public String getMeat() {
        return meat;
    }

    public void get() {
        System.out.println("Hamburger: " + bread + "+" + meat);
    }
}

2)创建汉堡包建造者接口 及 它的实现类

HamburgerBuilder.java

package com.cheney.demo;

interface HamburgerBuilder {
    void buildBread(String bread);
    void buildMeat(String meat);
    Hamburger getResult();
}

ConcreteHamburgerBuilder.java

package com.cheney.demo;

class ConcreteHamburgerBuilder implements HamburgerBuilder {
    private Hamburger hamburger;

    public ConcreteHamburgerBuilder() {
        this.hamburger = new Hamburger("", "");
    }

    @Override
    public void buildBread(String bread) {
        hamburger = new Hamburger(bread, hamburger.getMeat());
    }

    @Override
    public void buildMeat(String meat) {
        hamburger = new Hamburger(hamburger.getBread(), meat);
    }

    @Override
    public Hamburger getResult() {
        return hamburger;
    }
}

3)创建一个导者类

HamburgerDirector.java

package com.cheney.demo;

class HamburgerDirector {
    private final HamburgerBuilder hamburgerBuilder;

    public HamburgerDirector(HamburgerBuilder hamburgerBuilder) {
        this.hamburgerBuilder = hamburgerBuilder;
    }

    public void construct() {
        hamburgerBuilder.buildBread("三片面包");
        hamburgerBuilder.buildMeat("两片牛肉");
    }
}

在上述示例中,Hamburger 是产品类,定义了要构建的复杂对象。HamburgerBuilder 是抽象建造者接口,定义了构建复杂对象的抽象方法。ConcreteHamburgerBuilder 是具体建造者类,实现了抽象建造者接口,负责具体的构建步骤。HamburgerDirector 是指导者类,负责组织建造者的构建过程。

在使用中,我们可以通过以下方式制作汉堡包:

package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 创建 汉堡包建造者
        HamburgerBuilder hamburgerBuilder = new ConcreteHamburgerBuilder();

        // 创建指导者并设置建造者
        HamburgerDirector hamburgerDirector = new HamburgerDirector(hamburgerBuilder);

        // 指导建造者构建汉堡包
        hamburgerDirector.construct();

        // 获取构建好的汉堡包
        Hamburger hamburger = hamburgerBuilder.getResult();

        // 获取汉堡包
        hamburger.get();
    }
}

执行结果

在这里插入图片描述

结语

建造者模式是一种常见且实用的设计模式,它通过将一个复杂对象的构建与其表示分离,使得构建过程可以创建不同的表示。在实际开发中,建造者模式常用于构建复杂对象,避免构造器参数过多导致构造器方法签名冗长的情况。通过合理使用建造者模式,可以使系统更容易扩展和维护。

文章来源:https://blog.csdn.net/yanyc0411/article/details/135635729
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。