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

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

  • [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());
    }
}
相关推荐
代码之光_198020 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi25 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
StayInLove44 分钟前
G1垃圾回收器日志详解
java·开发语言
对许1 小时前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
小鑫记得努力1 小时前
Java类和对象(下篇)
java
binishuaio1 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE1 小时前
【Java SE】StringBuffer
java·开发语言
老友@1 小时前
aspose如何获取PPT放映页“切换”的“持续时间”值
java·powerpoint·aspose
wrx繁星点点1 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式