享元接口:
package fly_weight_mode; /** * 享元接口 */ public interface ChessFlyWeight { /** * 获得颜色 */ String getColor(); /** * 显示位置 */ void display(Coordinate c); }
具体享元类:
package fly_weight_mode; /** * 具体享元类(不可变类) */ public class ConcreteChess implements ChessFlyWeight{ /** * 颜色是共享(不变)的 * 该字段是: 为内部状态提供成员变量给予存储 * 享元模式中称此成员为: 内部状态ConcreteFlyWeight */ private String color; /** * 构造器(传入颜色) */ public ConcreteChess(String color){ this.color = color; } /** * 获得颜色 */ @Override public String getColor() { return color; } /** * 显示位置(传入坐标) */ @Override public void display(Coordinate c) { System.out.println("棋子颜色: " + color); System.out.println("棋子位置: " + c.getX() + "-----" + c.getY()); } }
坐标类:
package fly_weight_mode; /** * 坐标类(在享元对象中, 此对象是可更换的) * 享元模式中称此类为: 外部状态UnSharedConcreteFlyWeight */ public class Coordinate { private int x, y; public Coordinate(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
享元工厂类:
package fly_weight_mode; import java.util.HashMap; import java.util.Map; /** * 享元工厂类 */ public class ChessFlyWeightFactory { /** * 享元对象池(容器) */ private static Map<String, ChessFlyWeight> map = new HashMap<String, ChessFlyWeight>(); /** * 控制享元对象创建 * 此模式的核心: 有就取, 没有就创建, 达到复用, 节省内存空间(以时间换取空间) */ public static ChessFlyWeight getChess(String color){ if (map.get(color)!=null) { return map.get(color); }else { ChessFlyWeight cfw = new ConcreteChess(color); map.put(color, cfw); return cfw; } } }
测试类:
package fly_weight_mode; public class Client { public static void main(String[] args) { ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");//第一次, 享元池(容器)中, 没有则创建 ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess("黑色");//第二次已有, 直接取出来, 不创建对象 System.out.println(chess1); System.out.println(chess2);//同一个对象, 当做1号黑子吧! System.out.println("增加外部状态的处理------------------------"); chess1.display(new Coordinate(10, 10)); chess2.display(new Coordinate(20, 20));//1号黑子, 只有显示的位置发生了变化 //此demo是模拟, 真实是以编号不同则创建对象的 } }
执行结果:
fly_weight_model.ConcreteChess@1db9742 fly_weight_model.ConcreteChess@1db9742 增加外部状态的处理------------------------ 棋子颜色: 黑色 棋子位置: 10-----10 棋子颜色: 黑色 棋子位置: 20-----20
谢谢声明出处!
转自: http://www.cnblogs.com/gscq073240/articles/7110961.html