【设计模式】 建造者模式和原型模式

建造者模式(Builder Pattern)

概述

建造者模式是一种创建型设计模式,它允许逐步构建复杂对象。通过将构造过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式非常适合用于创建那些具有很多属性的对象,尤其是当有些属性是可选的时候。

优点
  • 可以控制一个产品的创建过程
  • 提供代码的复用性。
  • 支持变化:可以在不修改已有代码的情况下,对构建过程进行扩展或修改。
实现示例
java 复制代码
// 产品类
class Car {
    private String brand;
    private String model;
    private int year;

    // 私有构造函数
    private Car(Builder builder) {
        this.brand = builder.brand;
        this.model = builder.model;
        this.year = builder.year;
    }

    // 静态内部类作为建造者
    public static class Builder {
        private String brand;
        private String model;
        private int year;

        public Builder setBrand(String brand) {
            this.brand = brand;
            return this;
        }

        public Builder setModel(String model) {
            this.model = model;
            return this;
        }

        public Builder setYear(int year) {
            this.year = year;
            return this;
        }

        public Car build() {
            return new Car(this);
        }
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", model='" + model + '\'' +
                ", year=" + year +
                '}';
    }
}

// 客户端代码
public class BuilderPatternDemo {
    public static void main(String[] args) {
        Car car = new Car.Builder()
                .setBrand("BMW")
                .setModel("X5")
                .setYear(2022)
                .build();
        System.out.println(car);
    }
}

原型模式(Prototype Pattern)

概述

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过实例化。这在需要创建对象的开销较大时非常有用,因为它可以通过简单的复制来避免高昂的初始化成本。

优点
  • 性能提高:克隆对象比使用new关键字创建对象效率更高,尤其是在创建大量相似对象时。
  • 绕过构造函数:直接复制对象而不需要调用构造函数。
实现示例

Java中的原型模式通常使用Cloneable接口和Object.clone()方法实现。

java 复制代码
// 原型接口
interface Prototype extends Cloneable {
    Prototype clone() throws CloneNotSupportedException;
}

// 具体原型类
class Car implements Prototype {
    private String brand;
    private String model;

    public Car(String brand, String model) {
        this.brand = brand;
        this.model = model;
    }

    @Override
    public Prototype clone() throws CloneNotSupportedException {
        return (Prototype) super.clone();  // 浅克隆
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", model='" + model + '\'' +
                '}';
    }
}

// 客户端代码
public class PrototypePatternDemo {
    public static void main(String[] args) {
        try {
            Car originalCar = new Car("BMW", "X5");
            Car clonedCar = (Car) originalCar.clone();

            System.out.println("Original: " + originalCar);
            System.out.println("Cloned: " + clonedCar);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

在Java项目中的应用

  • 建造者模式 常被用于构建复杂的对象,例如Lombok包中的@Builder,是实体类支持建造者模式 ;在Google的Guava库中,ImmutableList.builder()也是一个很好的例子,它允许用户以灵活的方式构建不可变列表。

  • 原型模式 在Java的标准库中有广泛的应用,比如java.lang.Object#clone()方法就是原型模式的一个具体实现;以及常用的Hutool 工具包中的BeanUtil 中的copyProperties常用来实现对象拷贝

相关推荐
晨米酱4 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机9 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机10 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机10 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机10 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤10 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴1 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤1 天前
工厂模式
设计模式