原型模式

原型模式

原型模式(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 }
Hero

 

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 }
Ashe
 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 }
Galen
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 }
Ryze

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 }
HeroCache

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 }
PrototypePatternDemo

5、测试结果

Ashe is coming!
Galen is coming!
Ryze is coming!
View Code

 

 

posted @ 2019-11-25 17:45  honghj  阅读(316)  评论(0编辑  收藏  举报