Java结构型设计模式中建造者模式示例详解

作者:丨Jack_Chen丨 时间:2023-04-24 13:37:31 

建造者模式

概述

建造者模式(Builder Pattern)属于创建型模式。

它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

简而言之:建造者模式就是使用多个简单的对象一步一步构建成一个复杂的对象。

建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分离。

JDK的StringBuilder类中append()方法,提供了开放构造步骤,最后调用toString0方法就可以获得一个构造好的完整字符串。其就是一个建造者模式的体现。

Java结构型设计模式中建造者模式示例详解

角色

建造者模式提供四个主要角色:

1.产品(Product)

要创建的产品类对象。

2.建造者抽象(Builder)

建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。

3.建造者(ConcreteBuilder)

具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。

4.调用者(Director)

调用具体的建造者,来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保正对象各部分完整创建或按某种顺序创建。

Java结构型设计模式中建造者模式示例详解

优缺点

优点:

1.封装性好,创建和使用分离。

2.扩展性好,建造类之间独立、一定程度上解耦。

缺点:

1.产生多余的Builder对象。

2.产品内部发生变化,建造者都要修改,成本较大。

应用场景

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

2.需要生成的对象内部属性本身相互依赖。

3.相同的方法,不同的执行顺序,产生不同的结果。

4.当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。

基本使用

生产一辆Car的过程,需要一系列的步骤,假设这些步骤可以随意调整组合。

创建产品类

public class Car {
   /**
    * 名称
    */
   private String name;
   /**
    * 颜色
    */
   private String color;
   /**
    * 价格
    */
   private String price;
   /**
    * 类型
    */
   private String type;
   /**
    * 发动机
    */
   private String engine;
   /**
    * 轮子
    */
   private String wheel;
}

创建建造者类

创建建造者类,将复杂的构造过程封装起来,构造步骤由使用者决定

public class CarBuilder {
   private Car car = new Car();
   public CarBuilder addName(String name) {
       car.setName(name);
       return this;
   }
   public CarBuilder addColor(String color) {
       car.setColor(color);
       return this;
   }
   public CarBuilder addPrice(String price) {
       car.setPrice(price);
       return this;
   }
   public CarBuilder addType(String type) {
       car.setType(type);
       return this;
   }
   public CarBuilder addEngine(String engine) {
       car.setEngine(engine);
       return this;
   }
   public CarBuilder addWheel(String wheel) {
       car.setWheel(wheel);
       return this;
   }
   public Car build() {
       return car;
   }
}

使用

public static void main(String[] args) {
       CarBuilder carBuilder = new CarBuilder();
       Car car = carBuilder.addName("奔驰")
               .addColor("红色")
               .addPrice("100万")
               .addType("轿车")
               .addEngine("1.8T")
               .addWheel("18寸")
               .build();
       System.out.println(car);
   }

链式写法

建造者模式通常是采用链式编程的方式构造对象。

具体做法:

将产品类添加到建造者类中作为内部类,然后将构造步骤添加进去,完成每个步骤,都返回this关键字。

创建产品类与建造者类

public class CarBuilder {
   @Data
   public class Car {
       /**
        * 品牌
        */
       private String name;
       /**
        * 颜色
        */
       private String color;
       /**
        * 价格
        */
       private String price;
       /**
        * 类型
        */
       private String type;
       /**
        * 发动机
        */
       private String engine;
       /**
        * 轮子
        */
       private String wheel;
   }
   private Car car = new Car();
   public CarBuilder addName(String name) {
       car.setName(name);
       return this;
   }
   public CarBuilder addColor(String color) {
       car.setColor(color);
       return this;
   }
   public CarBuilder addPrice(String price) {
       car.setPrice(price);
       return this;
   }
   public CarBuilder addType(String type) {
       car.setType(type);
       return this;
   }
   public CarBuilder addEngine(String engine) {
       car.setEngine(engine);
       return this;
   }
   public CarBuilder addWheel(String wheel) {
       car.setWheel(wheel);
       return this;
   }
   public Car build() {
       return car;
   }
}

使用

public static void main(String[] args) {
       CarBuilder carBuilder = new CarBuilder();
       carBuilder.addName("奔驰").addColor("红色").addPrice("100万").addType("跑车").addEngine("发动机").addWheel("轮子");
       CarBuilder.Car car = carBuilder.build();
       System.out.println(car);
   }

来源:https://blog.csdn.net/qq_38628046/article/details/126087259

标签:Java,建造者模式,设计模式
0
投稿

猜你喜欢

  • C#集合遍历时删除和增加元素的方法

    2021-12-11 18:53:24
  • Java详细分析讲解泛型

    2023-02-05 07:56:02
  • C#中累加器函数Aggregate用法实例

    2023-03-21 10:28:30
  • Spring MVC中自定义拦截器的实例讲解

    2023-12-19 05:09:04
  • 实例讲述Java IO文件复制

    2023-01-30 17:25:32
  • Android应用动态修改主题的方法示例

    2022-01-08 10:50:34
  • C#使用Socket实现局域网聊天

    2021-07-20 02:13:20
  • Spring Mvc中传递参数方法之url/requestMapping详解

    2021-11-03 05:48:46
  • Spring如何使用注解的方式创建bean

    2022-01-29 03:45:49
  • 轻松学习C#的结构和类

    2023-12-10 13:46:19
  • Java中的字节,字符输出流与字节和字符输入流的简单理解

    2022-11-30 01:56:13
  • 浅谈一下Servlet的定义以及运行原理

    2023-08-14 10:50:07
  • AjaxControlToolkit AjaxFileUpload 显示英文改成中文的解决方法

    2021-06-01 21:09:57
  • Android Bluetooth蓝牙技术使用流程详解

    2022-07-07 02:41:16
  • 详解Java多态对象的类型转换与动态绑定

    2021-10-12 06:59:59
  • C#实现将浮点数表示的货币数量以汉字大写形式输出的方法

    2022-06-10 03:10:36
  • Java语法糖之个数可变的形参的实现

    2023-12-05 00:13:20
  • SpringBoot配置Profile实现多环境支持

    2023-07-29 21:53:20
  • Spring Security入门demo案例

    2023-07-01 18:57:30
  • Java使用自定义注解实现为事件源绑定事件监听器操作示例

    2023-06-21 01:17:55
  • asp之家 软件编程 m.aspxhome.com