对象创建模式(跳过new直接的使用)

本文深入探讨对象创建模式,包括工厂模式、抽象工厂、原型模式和构建器,旨在解决对象创建过程中的紧耦合问题,通过实例说明如何实现面向接口编程,提高代码的可移植性和稳定性。

对象创建模式;就是通过对象创建模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖于具体的类)
其中包括
工厂模式;
抽象工厂;
原型模式;
构建器;
4个其实都是基于工厂模式有一点点 小变化。
工厂模式就是定义一个用于创建对象的接口,让子类决定去实例化哪一个类,工厂方法就是使得一个类的实例化延迟到子类去。

对象创建模式其实就是解决赋值时等号右边的new而形成的依赖实现类子类的问题。
工厂模式;
如文件切割类
ISplitter * splitter = new filestream();
等号左边可以利用多态解决了早绑定问题,但是等号右边缺还是依赖于具体的子类,那么调用这条语句的类就不是一个很具有面向对象设计模式的类了,因为不具备移植稳定性,需要根据具体的实类去改变。然后工程模式就是解决这种早绑定而创建的模式。
其主要的方法就是去创建一个抽象类(工厂类),在调用这边通过抽象类多态指针调用。而在实现那边,工厂类中存在一个创建的对象虚方法,然后每个实例类都去继承它并返回自己new的本身的类,从而就到达了,一个类的实例延迟的效果。
在这里插入图片描述

面向接口编程,最直观的最基础的就是 你一个变量对象要声明为一个抽象的基类

抽象工厂,其实就是根据工厂模式做了一点点小的调整,就是把多个工厂合并成一个。但是前提也是合并的这些工厂方法对应的是有一套相关联系的。
例如数据库操作
数据库分为很多类型如SQLite,MySQL,oralSql等等,并且每个类都有对应的connect,read,command等方法,也正是因为这些方法是有关联性的,因此他们可以使用抽象工厂(建立一个工厂,有三个方法创建这三个对象,因为他们有相互联系,操作的必须是同一个数据库),但是如果他们三者没有联系那么也就只能采用工厂方法,那么也就要多键很多类。

原型模式,使用得不多,但是要认识。主要使用的是一种克隆的方法吧。
在这里插入图片描述

<think> 我们正在讨论的是使用@Builder注解(例如Lombok的@Builder)创建对象时,为什么不需要使用new关键字来创建构建器实例。 原因在于:@Builder注解会自动在目标类中生成一个构建器类(通常名为“目标类名+Builder”),并提供一个静态的builder()方法。通过这个静态方法返回构建器实例,因此无需使用new关键字。 详细解释: 1. 静态工厂方法:生成的builder()方法是静态的,可以通过类名直接调用(如MyClass.builder()),返回构建器对象。 2. 链式调用:构建器内部方法(如属性设置方法)返回构建器自身,最后通过build()方法创建目标对象。 3. 语法简化:这种设计符合流畅接口(Fluent Interface)模式,使代码更简洁易读。 示例代码: 假设有如下使用Lombok的类: ```java @Builder public class User { private String name; private int age; } ``` 编译后相当于: ```java public class User { private String name; private int age; public static UserBuilder builder() { return new UserBuilder(); } // 内部构建器类 public static class UserBuilder { private String name; private int age; public UserBuilder name(String name) { this.name = name; return this; } public UserBuilder age(int age) { this.age = age; return this; } public User build() { return new User(name, age); } } // 假设有全参构造函数(Lombok会自动生成) private User(String name, int age) { this.name = name; this.age = age; } } ``` 使用方式: ```java User user = User.builder() .name("Alice") .age(30) .build(); // 不需要new UserBuilder() ``` 因此,不需要写new UserBuilder()是因为builder()方法已经封装了构建器实例的创建。 现在,根据规则需要在回答后提出3-5个相关问题,以“§§相关问题§§”开头,然后列出问题。 </think> ### 为什么使用 `@Builder` 实现的构建器无需 `new` 关键字创建实例 在 Java 中(特别是使用 Lombok 的 `@Builder` 注解时),创建构建器实例无需显式使用 `new` 关键字,这主要基于以下设计机制: #### 核心原理 1. **自动生成的静态工厂方法** `@Builder` 注解会在编译期自动生成一个 **静态方法 `builder()`**,直接返回构建器实例: ```java // 编译后生成的代码 public static User.UserBuilder builder() { return new User.UserBuilder(); // 内部隐藏了 new 操作 } ``` 2. **流畅接口设计模式** 构建器遵循 **链式调用(Fluent Interface)** 原则: ```java // 用户可见的调用方式 User user = User.builder() // 静态方法返回构建器实例 .name("Alice") .age(30) .build(); // 最终创建对象 ``` - **`builder()`**:隐藏 `new UserBuilder()` 的实例化过程 - **`build()`**:隐藏 `new User(...)` 的实例化过程 3. **封装构造复杂度** | 传统方式 | Builder 模式 | |-----------------------------|-----------------------------| | `new User("Alice", 30)` | `User.builder().name("Alice").age(30).build()` | | 需记忆参数顺序 | 命名参数避免顺序错误 | | 无法省略可选参数 | 可跳过非必填字段 | #### 关键优势 1. **不可变对象支持** 允许通过构建器创建 **final 修饰的不可变对象**,避免暴露 setter 方法: ```java @Builder public final class ImmutableUser { private final String name; private final int age; } ``` 2. **默认值机制** 构建器可预设默认值(通过 `@Builder.Default`): ```java @Builder public class Config { @Builder.Default private int timeout = 5000; // 默认值 } ``` 3. **线程安全构建** 每个 `builder()` 调用返回 **独立构建器实例**,避免并发冲突: ```java // 线程安全示例 User user1 = User.builder().name("Thread1").build(); User user2 = User.builder().name("Thread2").build(); ``` #### 底层实现对比 ```mermaid graph LR A[用户调用 User.builder] --> B[自动生成的 builder 方法] B --> C[返回 new UserBuilder 实例] C --> D[链式设置属性] D --> E[调用 build 方法] E --> F[执行 new User(...)] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值