创建型模式
创建型模式
Creational
Patterns
- 创建型模式关注如何创建对象,将对象的实例化和声明相分离。
- 关注于对象的创建过程,目的是将对象的实例化与客户端的使用分离。
- 通过这种方式,系统中的具体类的实例化不会使代码变得僵硬,增加了系统的灵活性和可维护性。
- 更有效地封装和抽象化对象的创建过程。
创建型模式包括:
- 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
- 工厂方法模式(Factory Method):定义一个创建对象的接口,让子类决定实例化哪一个类。
- 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
- 建造者模式(Builder):使用多个简单的对象一步一步构建成一个复杂的对象。
- 原型模式(Prototype):通过复制现有的实例来创建新的实例,而不是通过新建实例。
单例模式
保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
1 | public class Singleton { |
volatile
: 这是 Java 语言的一个关键字,用于指示 JVM(Java 虚拟机),这个变量可能会被多个线程同时访问和修改,但是它不会被线程缓存(每次访问变量时都要从主内存中读取),并且每次修改都会立即写入主内存。这个关键字的主要作用是确保变量的可见性和防止指令重排序优化,这对于多线程环境下安全创建单例至关重要。
工厂方法模式
- 在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
- 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
- 如果你希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。
- 如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法。
1 | public interface Shape { |
抽象工厂模式
- 创建一系列相关的对象
- 无需指定其具体类。
- 其他工厂的工厂。
1 | //定义抽象工厂 |
这段 Java 代码完整实现了抽象工厂模式,包括抽象工厂接口、具体工厂类、抽象产品接口、具体产品类以及客户端代码。客户端代码仅依赖于抽象类型(GUIFactory、Button 和 Checkbox),使得你可以在不修改客户端代码的情况下引入新的工厂或产品变体。
建造者模式
- AKA生成器模式
- 分步骤创建复杂对象
- 使用相同的创建代码生成不同类型和形式的对象。
- 链式编程
- 只有当产品较为复杂且需要详细配置时,使用生成器模式才有意义。
1 | public class Car { |
这段 Java 代码展示了如何实现生成器模式,其中包括创建复杂对象的过程,使得最终产品的构建与其表示分离,允许相同的构建过程创建不同的表示。
原型模式
复制已有对象
当直接创建对象的代价比较大时,则采用这种模式。
Java 中,原型模式通常通过实现
Cloneable
接口并重写Object
类的clone()
方法来实现。
1 | import java.util.HashMap; |
这段代码展示了原型设计模式的核心:通过克隆现有对象来创建新对象,从而避免了通过
new 关键字创建对象带来的成本。这里,Shape
抽象类实现了
Cloneable
接口,允许其子类 Rectangle
和
Circle
被克隆。ShapeCache
类用于预存储和克隆形状对象,而客户端代码演示了如何从缓存中获取并使用这些克隆对象。