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

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

  • [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());
    }
}
相关推荐
吴名氏.2 分钟前
电子书《21天学通Java(第5版)》
java·开发语言·21天学通java
曼巴UE514 分钟前
UE5 C++ JSON 最简单,麻烦的方式,直接读存(一)
java·服务器·前端
吃饺子不吃馅19 分钟前
面试官:JWT、Cookie、Session、Token有什么区别?
前端·设计模式·面试
QMY52052036 分钟前
什么是爬虫?
java·eclipse
bbq粉刷匠37 分钟前
力扣--两数之和(Java)
java·leetcode
mzlogin39 分钟前
解决访问 https 网站时,后端重定向或获取 URL 变成 http 的问题
java·后端·nginx
江湖独行侠42 分钟前
认知神经科学解释生活中的现象——白月光、朱砂痣
java·服务器·生活·情绪
paopao_wu44 分钟前
DeepSeek-OCR实战(06):SpringBoot应用接入
java·spring boot·ai·ocr·deepseek
せいしゅん青春之我1 小时前
【JavaEE初阶】IP协议-IP地址不够用了咋办?
java·服务器·网络·网络协议·tcp/ip·java-ee
醇氧1 小时前
MAC 安装openJDK8
java·开发语言