设计模式(六):原型模式

设计模式(六):原型模式

  • [1. 原型模式的介绍](#1. 原型模式的介绍)
  • [2. 原型模式的类图](#2. 原型模式的类图)
  • [3. 原型模式的实现](#3. 原型模式的实现)
    • [3.1 创建一个原型接口](#3.1 创建一个原型接口)
    • [3.2 创建具体原型](#3.2 创建具体原型)
    • [3.3 创建一个数据缓存类](#3.3 创建一个数据缓存类)
    • [3.4 测试](#3.4 测试)

1. 原型模式的介绍

原型模式(Prototype Pattern)属于创建型模式,是用于创建重复的对象,同时又能保证性能。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

使用场景:

  1. 资源优化场景:类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
  2. 安全要求的场景:只读场景可以提供一个克隆对象。
  3. 一个对象多个修改者的场景。

原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写clone();深拷贝是通过实现 Serializable 读取二进制流。

2. 原型模式的类图

3. 原型模式的实现

3.1 创建一个原型接口

实现Cloneable接口,重写clone()

java 复制代码
package blog;

/**
 * 原型接口
 */
public abstract class AbstractPrototype implements Cloneable  {
    @Override
    public AbstractPrototype clone() {
        try {
            return (AbstractPrototype) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

3.2 创建具体原型

java 复制代码
package blog;

/**
 * 原型对象
 */
public class ConcretePrototype extends AbstractPrototype{
    private String id;

    public ConcretePrototype(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
}

3.3 创建一个数据缓存类

java 复制代码
package blog;

import java.util.HashMap;
import java.util.Map;

/**
 * 数据缓存
 */
public class CacheData {
    private static Map<String, AbstractPrototype> datas = new HashMap<>();

    public static AbstractPrototype getPrototype(String id) {
        AbstractPrototype abstractPrototype = datas.get(id);
        return abstractPrototype.clone();
    }

    public static void loadData() {
        datas.put("1", new ConcretePrototype("1"));
        datas.put("2", new ConcretePrototype("2"));
        datas.put("3", new ConcretePrototype("3"));
    }
}

3.4 测试

java 复制代码
package blog;

public class PrototypeDemo {
    public static void main(String[] args) {
        CacheData.loadData();

        ConcretePrototype prototype = (ConcretePrototype)CacheData.getPrototype("1");
        System.out.println("这里是原型:" + prototype.getId());
    }
}
相关推荐
plainGeekDev35 分钟前
NullPointerException → Kotlin 空安全
android·java·kotlin
想做小南娘,发现自己是女生喵2 小时前
第 2 章 顺序表和 vector
java·数据结构·算法
CHANG_THE_WORLD2 小时前
6.多线程的TCP通信
java·网络·tcp/ip
sun03223 小时前
【笔记】Spring MVC 相关介绍
java·spring·mvc
兰令水4 小时前
hot100【acm版】【2026.7.18打卡-java版本】
java·开发语言·算法
CoderYanger4 小时前
A.每日一题:3020. 子集中元素的最大数量
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
wear工程师5 小时前
CompletableFuture 的 allOf 到底怎么收结果?面试别只说并行
java·后端
倒流时光三十年5 小时前
Logback 系列(3):三大核心组件 Logger / Appender / Encoder
java·开发语言·logback
解局易否结局5 小时前
ArkUI MVI 架构实战:单向数据流设计模式在 HarmonyOS NEXT 中的深度实践
华为·设计模式·架构·harmonyos
什巳5 小时前
JAVA练习312- 二叉搜索树中第 K 小的元素
java·数据结构·算法·leetcode