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

发布于:2024-04-29 ⋅ 阅读:(33) ⋅ 点赞:(0)

1. 原型模式的介绍

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

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

使用场景:

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

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

2. 原型模式的类图

在这里插入图片描述

3. 原型模式的实现

3.1 创建一个原型接口

实现Cloneable接口,重写clone()

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 创建具体原型

package blog;

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

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

    public String getId() {
        return id;
    }
}

3.3 创建一个数据缓存类

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 测试

package blog;

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

        ConcretePrototype prototype = (ConcretePrototype)CacheData.getPrototype("1");
        System.out.println("这里是原型:" + prototype.getId());
    }
}