设计模式(六):原型模式
- [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)属于创建型模式,是用于创建重复的对象,同时又能保证性能。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。
使用场景:
- 资源优化场景:类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
- 安全要求的场景:只读场景可以提供一个克隆对象。
- 一个对象多个修改者的场景。
原型模式
是通过拷贝一个现有对象生成新对象的。浅拷贝实现 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());
}
}