原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
1、创建Cloneable 接口的抽象类

1 public abstract class Hero implements Cloneable {
2 private String id;
3 protected String name;
4
5 abstract void behavior();
6
7 public Object clone() {
8 Object clone = null;
9 try {
10 clone = super.clone();
11 } catch (CloneNotSupportedException e) {
12 e.printStackTrace();
13 }
14 return clone;
15 }
16
17 public String getId() {
18 return id;
19 }
20
21 public void setId(String id) {
22 this.id = id;
23 }
24
25 public String getName() {
26 return name;
27 }
28
29 public void setName(String name) {
30 this.name = name;
31 }
32 }
2、创建实体类

1 public class Ashe extends Hero {
2 public Ashe(){
3 name = "Ashe";
4 }
5 @Override
6 void behavior() {
7 System.out.println("Ashe is coming!");
8 }
9 }

1 public class Galen extends Hero {
2 public Galen(){
3 name = "Glaen";
4 }
5
6 @Override
7 void behavior() {
8 System.out.println("Galen is coming!");
9 }
10 }

1 public class Ryze extends Hero{
2 public Ryze(){
3 name = "Ryze";
4 }
5 @Override
6 void behavior() {
7 System.out.println("Ryze is coming!");
8 }
9 }
3、通过Hashtable 创建缓存类
(从数据库获取实体类,并把它们存储在一个 Hashtable 中)

1 import java.util.Hashtable;
2
3 public class HeroCache {
4 public static Hashtable<String,Hero> heroMap = new Hashtable<>();
5
6 public static Hero getHero(String HeroId){
7 Hero hero = heroMap.get(HeroId);
8 return (Hero)hero.clone();
9 }
10
11 public static void loadCache(){
12 Ashe ashe = new Ashe();
13 ashe.setId("1");
14 heroMap.put(ashe.getId(),ashe);
15
16 Galen galen = new Galen();
17 galen.setId("2");
18 heroMap.put(galen.getId(),galen);
19
20 Ryze ryze = new Ryze();
21 ryze.setId("3");
22 heroMap.put(ryze.getId(),ryze);
23
24 }
25 }
4、测试类

1 public class PrototypePatternDemo {
2 public static void main(String[] args) {
3 HeroCache.loadCache();
4
5 Hero cloneHero1 = HeroCache.getHero("1");
6 cloneHero1.behavior();
7 Hero cloneHero2 = HeroCache.getHero("2");
8 cloneHero2.behavior();;
9 Hero cloneHero3 = HeroCache.getHero("3");
10 cloneHero3.behavior();
11 }
12 }
5、测试结果

Ashe is coming! Galen is coming! Ryze is coming!
