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