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

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

  • [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());
    }
}
相关推荐
千千寰宇26 分钟前
[设计模式/Java/多线程] 设计模式之单例模式【9】
设计模式·操作系统-进程/线程/并发
咖啡教室4 小时前
java日常开发笔记和开发问题记录
java
咖啡教室4 小时前
java练习项目记录笔记
java
鱼樱前端5 小时前
maven的基础安装和使用--mac/window版本
java·后端
RainbowSea5 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea5 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
李少兄7 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝7 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖7 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601017 小时前
rust 同时处理多个异步任务
java·数据库·rust