设计模式(六):原型模式
- 1. 原型模式的介绍
- 2. 原型模式的类图
- 3. 原型模式的实现
- 3.1 创建一个原型接口
- 3.2 创建具体原型
- 3.3 创建一个数据缓存类
- 3.4 测试
1. 原型模式的介绍
原型模式
(Prototype Pattern)属于创建型模式,是用于创建重复的对象,同时又能保证性能。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。
使用场景:
- 资源优化场景:类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
- 安全要求的场景:只读场景可以提供一个克隆对象。
- 一个对象多个修改者的场景。
原型模式
是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable
,重写clone();深拷贝是通过实现 Serializable
读取二进制流。
2. 原型模式的类图
3. 原型模式的实现
3.1 创建一个原型接口
实现Cloneable接口,重写clone()
package blog;/*** 原型接口*/
public abstract class AbstractPrototype implements Cloneable {@Overridepublic 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());}
}