原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 所谓原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

在原型模式中,所发动创建的对象通过请求原型对象来拷贝原型对象自己来实现创建过程,当然所发动创建的对象需要知道原型对象的类型。这里也就是说所发动创建的对象只需要知道原型对象的类型就可以获得更多的原型实例对象,至于这些原型对象时如何创建的根本不需要关心。

讲到原型模式了,我们就不得不区分两个概念:深拷贝、浅拷贝。
  • 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。
  • 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

/*
* Copyright,ShanNong Inc,2018 and onwards
*
* Author:fanghua fan
*/

package com.fanghua.designpattrn.prototype;

import java.util.Hashtable;

/**
* 原型模式
*/
public class PrototypePattern {

public static void main(String[] args) {
MathCache.loadCache();

Math clonedShape = (Math) MathCache.getMath(1);
System.out.println("Math : " + clonedShape.study());

Math clonedShape2 = (Math) MathCache.getMath(2);
System.out.println("Math : " + clonedShape2.study());
}
}

/**
* 数学抽象接口
*/
abstract class Math implements Cloneable {
private Integer id;
private String name;

public abstract String study();

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}

/**
* 数学分析学习
*/
class AnalysicsMath extends Math {
public String study() {
System.out.println("Analysics study!");
return "ok";
}
}

/**
* 数论学习
*/
class NumberTheoryMath extends Math {
public String study() {
System.out.println("NumberYheoryMath study!");
return "ok";
}
}

/**
* 对象缓存
*/
class MathCache {

private static Hashtable<Integer, Math> shapeMap
= new Hashtable<Integer, Math>();

public static Math getMath(Integer shapeId) {
Math cachedShape = shapeMap.get(shapeId);
return (Math) cachedShape.clone();
}

public static void loadCache() {
AnalysicsMath a = new AnalysicsMath();
a.setId(1);
shapeMap.put(a.getId(), a);

NumberTheoryMath n = new NumberTheoryMath();
n.setId(2);
shapeMap.put(n.getId(), n);
}
}

参考文献:
https://www.cnblogs.com/chenssy/p/3313339.html
http://www.runoob.com/design-pattern/prototype-pattern.html