java实现建造者模式(Builder Pattern)

下面我就详细讲解一下“Java实现建造者模式(Builder Pattern)”的完整攻略。

什么是建造者模式?

建造者模式是一种对象创建型设计模式,它允许你创建不同风格的对象,同时避免构造器污染问题。在该模式中,我们将构造过程分步进行,使得在创建对象时能够更加灵活地控制每个构造步骤,从而创建不同类型的对象。

建造者模式的角色

建造者模式中有以下几个角色:

1. Product

Product 表示要生成的复杂对象,包含多个子部件。

2. Builder

Builder 定义抽象接口,规范了将部件装配到产品中的方法。

3. ConcreteBuilder

ConcreteBuilder 实现 Builder 接口,定义将具体部件装配到产品中的方法。

4. Director

Director 负责按照一定的顺序调用 Builder 中的方法来装配部件,然后构建复杂对象。

Java实现建造者模式示例

下面我们来看一下建造者模式的代码示例。

示例一:建造一个电脑

// Product
public class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;
    private String display;

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getHardDisk() {
        return hardDisk;
    }

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }

    public String getDisplay() {
        return display;
    }

    public void setDisplay(String display) {
        this.display = display;
    }
}

// Builder
public interface ComputerBuilder {
    void setCpu();

    void setMemory();

    void setHardDisk();

    void setDisplay();

    Computer getProduct();
}

// ConcreteBuilder
public class StandardComputerBuilder implements ComputerBuilder {
    Computer computer = new Computer();

    @Override
    public void setCpu() {
        computer.setCpu("Intel Core i5-8300H");
    }

    @Override
    public void setMemory() {
        computer.setMemory("8GB DDR4 2666MHz");
    }

    @Override
    public void setHardDisk() {
        computer.setHardDisk("256GB SSD");
    }

    @Override
    public void setDisplay() {
        computer.setDisplay("15.6 inch FHD (1920 x 1080)");
    }

    @Override
    public Computer getProduct() {
        return computer;
    }
}

// Director
public class ComputerDirector {
    private ComputerBuilder computerBuilder;

    public ComputerDirector(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    public void buildComputer() {
        computerBuilder.setCpu();
        computerBuilder.setMemory();
        computerBuilder.setHardDisk();
        computerBuilder.setDisplay();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        ComputerBuilder builder = new StandardComputerBuilder();
        ComputerDirector director = new ComputerDirector(builder);
        director.buildComputer();
        Computer computer = builder.getProduct();
        System.out.println(computer.getCpu());
        System.out.println(computer.getMemory());
        System.out.println(computer.getHardDisk());
        System.out.println(computer.getDisplay());
    }
}

在这个示例中,我们为电脑创建了一个 Product 类,表示要生成的电脑,包含了 cpu、memory、hardDisk 和 display 四个属性。然后创建了一个 Builder 接口,定义了将各个部件装配到电脑中的方法。接着创建了一个 ConcreteBuilder 类 StandardComputerBuilder,它实现了 Builder 接口,定义了将具体部件装配到电脑中的方法。然后创建了一个 Director 类 ComputerDirector,它负责按照一定的顺序调用 Builder 中的方法来装配部件,然后构建电脑。最后在客户端创建了一个 StandardComputerBuilder 对象,并将其传递给 ComputerDirector,调用 buildComputer 方法构建电脑,然后获取产品的实例。

示例二:建造一个鸟的巢

// Product
public class BirdNest {
    private int size;
    private String material;
    private String location;

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public String getMaterial() {
        return material;
    }

    public void setMaterial(String material) {
        this.material = material;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }
}

// Builder
public interface BirdNestBuilder {
    void setSize();

    void setMaterial();

    void setLocation();

    BirdNest getProduct();
}

// ConcreteBuilder
public class WeaveBirdNestBuilder implements BirdNestBuilder {
    BirdNest nest = new BirdNest();

    @Override
    public void setSize() {
        nest.setSize(10);
    }

    @Override
    public void setMaterial() {
        nest.setMaterial("straw and twigs");
    }

    @Override
    public void setLocation() {
        nest.setLocation("in a tree");
    }

    @Override
    public BirdNest getProduct() {
        return nest;
    }
}

// Director
public class BirdNestDirector {
    private BirdNestBuilder nestBuilder;

    public BirdNestDirector(BirdNestBuilder nestBuilder) {
        this.nestBuilder = nestBuilder;
    }

    public void buildNest() {
        nestBuilder.setSize();
        nestBuilder.setMaterial();
        nestBuilder.setLocation();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        BirdNestBuilder builder = new WeaveBirdNestBuilder();
        BirdNestDirector director = new BirdNestDirector(builder);
        director.buildNest();
        BirdNest nest = builder.getProduct();
        System.out.println(nest.getMaterial());
        System.out.println(nest.getLocation());
        System.out.println(nest.getSize());
    }
}

在这个示例中,我们为鸟的巢创建了一个 Product 类,表示要生成的巢,包含了 size、material 和 location 三个属性。然后创建了一个 Builder 接口,定义了将各个部件装配到巢中的方法。接着创建了一个 ConcreteBuilder 类 WeaveBirdNestBuilder,它实现了 Builder 接口,定义了将具体部件装配到巢中的方法。然后创建了一个 Director 类 BirdNestDirector,它负责按照一定的顺序调用 Builder 中的方法来装配部件,然后构建巢。最后在客户端创建了一个 WeaveBirdNestBuilder 对象,并将其传递给 BirdNestDirector,调用 buildNest 方法构建巢,然后获取产品的实例。

建造者模式的优点

  1. 建造者模式将创建对象的过程分步进行,可以更加灵活地控制每个构造步骤,从而创建不同类型的对象。
  2. 建造者模式可以避免构造器污染问题,提高代码的可读性和可维护性。
  3. 建造者模式可以将复杂对象的创建过程独立出来,方便后期修改和维护。

总结

这就是 Java 实现建造者模式的完整攻略,建造者模式是一种非常实用的设计模式,能够有效地提高代码的可读性和可维护性。可以根据具体的需求选择不同的 Builder 构造器,从而得到不同类型的对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现建造者模式(Builder Pattern) - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Java之字节码以及优势案例讲解

    Java之字节码以及优势案例讲解 什么是Java字节码? Java字节码是Java源代码编译后得到的二进制字节码文件,其扩展名为.class,使用JVM(Java虚拟机)来运行。相比于源代码,Java字节码更加节省空间,并且可以跨平台运行。 Java字节码可以通过反编译工具获取到其源代码,但是由于编译后的代码进行了优化,所以反编译后的源代码可能不太容易阅读。…

    Java 2023年5月27日
    00
  • java定义数组的三种类型总结

    Java定义数组的三种类型 在 Java 中,定义数组有三种类型:一维数组、二维数组和不规则数组。这篇攻略将详细介绍这三种类型的定义方式及注意事项。 一维数组 一维数组是最常见的数组类型,可以理解为一个线性的排列方式。Java 中定义一维数组的方式如下: // 定义一个 int 类型的一维数组 int[] array1 = new int[5]; // 定义…

    Java 2023年5月26日
    00
  • Java 实战项目之毕业设计管理系统的实现流程

    Java 实战项目之毕业设计管理系统的实现流程 项目背景介绍 毕业设计管理系统是一款便于学校教师、学生交流的平台,旨在方便学生申请并确认自己的毕设课题,并使教师能够更好的管理学生的毕业设计过程,帮助学生更好的完成毕设项目。 项目实现流程 第一步、需求调研 在设计毕业设计管理系统之前,我们首先需要对项目需求进行调研和分析,确定不同用户的需求,并了解他们可能遇到…

    Java 2023年5月24日
    00
  • 一文带你弄懂Java中线程池的原理

    一文带你弄懂Java中线程池的原理 线程池的概念 线程池是指一组预先创建好的线程,可以被程序反复使用,用于执行多个任务。线程池的好处在于可以管理线程数量、重用线程以及减少线程创建和销毁的开销。 在Java中,线程池相关的类都位于java.util.concurrent包中。 线程池的组成 线程池主要由以下几个组成部分: 线程池管理器(ThreadPoolEx…

    Java 2023年5月19日
    00
  • SpringBoot2学习之springboot与spring区别分析

    Spring Boot是基于Spring框架的快速开发框架,它可以帮助我们快速构建Spring应用程序。在学习Spring Boot时,我们需要了解Spring Boot与Spring框架之间的区别。本文将详细讲解Spring Boot与Spring框架之间的区别,并提供两个示例。 1. Spring Boot与Spring框架的区别 Spring Boot…

    Java 2023年5月15日
    00
  • springboot2.x实现oauth2授权码登陆的方法

    下面是详细讲解“springboot2.x实现oauth2授权码登陆的方法”的完整攻略: 什么是OAuth2? OAuth2是目前最流行的用户认证和授权协议之一。它的目的是让用户可以授权第三方应用访问他们的资源,而不必将自己的用户名和密码直接提供给第三方应用。OAuth2协议有多种授权方式,其中最常用的是授权码模式。 OAuth2授权码模式流程 OAuth2…

    Java 2023年5月20日
    00
  • 五分钟教你手写 SpringBoot 本地事务管理实现

    手写Spring Boot本地事务管理实现 在Spring Boot应用程序中,我们可以使用本地事务管理来保证数据的一致性和完整性。本文将详细讲解手写Spring Boot本地事务管理实现的完整攻略,并提供两个示例。 1. 配置数据源和事务管理器 以下是配置数据源和事务管理器的基本流程: 在pom.xml文件中添加以下依赖: <dependency&g…

    Java 2023年5月15日
    00
  • Java Spring JdbcTemplate基本使用详解

    Java Spring JdbcTemplate基本使用详解 Java Spring JdbcTemplate是一个操作数据库的类库,对于Java开发者来说是一项重要的技能。在使用JdbcTemplate的过程中,需要遵循一些基本的使用规则,接下来我们将详细介绍JdbcTemplate的使用方法。 JdbcTemplate的简介 JdbcTemplate是S…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部