设计模式之享元模式
享元模式的定义为:采用一个共享类来避免大量拥有相同内容的“小类”的开销。由此看来享元模式的主要的目的还是节省资源,主要是内存资源,感觉有点像单例。
享元模式的组成部分:
1) 抽象享元角色:为具体享元角色规定了必须实现的方法,而外蕴状态就是以参数的形式通过此方法传入。在 Java 中可以由抽象类、接口来担当。
2) 具体享元角色:实现抽象角色规定的方法。如果存在内蕴状态,就负责为内蕴状态提供存储空间。
3) 享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!
4) 客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外蕴状态。
例子如下:
1 package com.cnblogs.ipolaris.Flyweight.test; 2 /** 3 * 抽象享元角色 4 * @author iPolaris 5 * 6 */ 7 public interface UpperChar { 8 public void show(); 9 } 10 11 package com.cnblogs.ipolaris.Flyweight.test; 12 /** 13 * 具体享元角色 14 * @author iPolaris 15 * 16 */ 17 public class MyUpper implements UpperChar { 18 char upperc ; 19 public MyUpper(char c){ 20 this .upperc = ( char)(c-32); 21 } 22 @Override 23 public void show() { 24 System. out .println(upperc ); 25 } 26 27 } 28 29 30 package com.cnblogs.ipolaris.Flyweight.test; 31 32 import java.util.HashMap; 33 import java.util.Map; 34 /** 35 * 享元工厂角色 36 * @author iPolaris 37 * 38 */ 39 public class FlyweightFactory { 40 private Map<Character, MyUpper> uppers ; 41 public FlyweightFactory(){ 42 uppers = new HashMap<Character, MyUpper>(); 43 } 44 45 public MyUpper getUpper(Character c){ 46 MyUpper mychar = uppers.get(c); 47 if (mychar == null){ 48 mychar = new MyUpper(c); 49 uppers.put(c, mychar); 50 } 51 return mychar; 52 } 53 } 54 55 package com.cnblogs.ipolaris.Flyweight.test; 56 57 public class Test { 58 59 60 public static void main(String[] args) { 61 FlyweightFactory factory = new FlyweightFactory(); 62 MyUpper uppera1 = factory.getUpper( 'a'); 63 MyUpper uppera2 = factory.getUpper( 'a'); 64 65 uppera1.show(); 66 uppera2.show(); 67 System. out .println(uppera1 == uppera2); 68 } 69 70 }
运行结果为:
A
A
true
uppera1和uppera2是一个对象,由此达到了数据共享节省内存的目的