清淨
  • Java

    • Java 基础
  • 框架

    • Flyway
    • MapStruct
    • Spring Cloud
  • 中间件

    • Elasticsearch
    • Redis
    • RabbitMQ
    • Kafka
  • 三剑客

    • HTML
    • CSS
    • JavaScript
  • 进阶

    • jQuery
    • ECMAScript6
    • TypeScript
  • Vue

    • Vue2
    • Vue3
    • VuePress
  • Linux
  • Jenkins
  • Maven
  • MySQL
  • 插件工具
  • 代码集成
  • 其它

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • 设计模式
迁移日志
订阅号
微信订阅号
微信订阅号
GitHub
  • Java

    • Java 基础
  • 框架

    • Flyway
    • MapStruct
    • Spring Cloud
  • 中间件

    • Elasticsearch
    • Redis
    • RabbitMQ
    • Kafka
  • 三剑客

    • HTML
    • CSS
    • JavaScript
  • 进阶

    • jQuery
    • ECMAScript6
    • TypeScript
  • Vue

    • Vue2
    • Vue3
    • VuePress
  • Linux
  • Jenkins
  • Maven
  • MySQL
  • 插件工具
  • 代码集成
  • 其它

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • 设计模式
迁移日志
订阅号
微信订阅号
微信订阅号
GitHub
  • 设计模式

    • 简介
    • 软件设计原则
    • 创建型模式

      • 概述
      • 单例模式
      • 工厂模式
      • 原型模式
      • 建造者模式
    • 结构型模式

      • 概述
      • 代理模式
      • 适配器模式
      • 装饰器模式
    • 行为模式

      • 概述
      • 责任链模式
      • 观察者模式
      • 策略模式
      • 模板方法模式

原型模式

用一个已经创建的实例作为原型,通过复制这个原型对象来创建一个和原型一样的新对象。

原型模式包含如下角色:

  • Prototype: 抽象原型类,声明克隆方法。
  • ConcretePrototype: 具体原型类,实现克隆方法。
  • Client: 客户类,使用具体原型类中的克隆方法创建一个新的对象。

Java 中的 Object 类提供了一个 clone() 方法,可以将一个对象复制一份,但是需要实现 Cloneable 接口。Cloneable 接口就是一个抽象原型类,而实现了这个接口的类就是具体原型类。

public class User implements Cloneable {

    private String userName;
    private String password;


    @Override
    public User clone() {
        try {
            return (User) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    public static void main(String[] args) {
        User user = new User();
        user.userName = "daijunfeng";
        System.out.println(user.clone() == user);
    }
}

原型模式适用于创建重复的对象,同时又能保证性能,它提供了一种创建对象的最佳方式。优点是简化对象的创建过程,通过克隆的方式创建对象,而不是通过 new 关键字。缺点是需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改其源代码,违背了开闭原则。

原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可以使程序运行更高效。

需要注意的是,克隆是浅拷贝,如果需要深拷贝需要额外处理。

想要编辑此页?
上次更新: 2024/7/23 22:16
贡献者: Junfeng Dai
←工厂模式建造者模式→
[ 纸上得来终觉浅绝知此事要躬行 ]
Copyright © 2021-present Junfeng Dai
蜀ICP备2021009537号