享元模式(flyweight)
当需要有很多完全相同或相似的对象需要创建的时候,主要是相似的时候,我们可以用享元模式。尽可能少创建对象,节省内存。
享元模式主要有4中角色
1.享元的工厂
2.抽象享元对象
2.内部状态对象:可以共享的
3.外部状态对象:不可以共享的
下面以围棋的棋子为例:每个棋子都是一个对象,但是每个棋子的大部分都一样,只有颜色,摆放位置不一样,这样就没必要每个棋子都创建一个对象,把相同的和不同的分离开来。
//享元类抽象 public interface FlyWeight { void setColor(String color); String getColor(); void diplay(Waibu c); } //内部,可以共享的分离出来,引用外部不可以共享的 class Neibu implements FlyWeight{ private String color; public Neibu(String color) { this.color = color; } public void setColor(String color) { this.color = color; } public String getColor() { return color; } public void diplay(Waibu c) { System.out.println("棋子颜色"+color); System.out.println("棋子为止"+c.getX()+":"+c.getY()); } } //外部,不可以共享的分离出来 class Waibu{ private String x; private String y; public Waibu(String x, String y) { this.x = x; this.y = y; } public String getX() { return x; } public void setX(String x) { this.x = x; } public String getY() { return y; } public void setY(String y) { this.y = y; }
//享元工厂 public class FlyWeightFactory { private static Map<String, FlyWeight> map = new HashMap<String, FlyWeight>(); public static FlyWeight get(String color){ if(map.get(color)!=null){ return map.get(color); }else{ FlyWeight flyWeight = new Neibu(color); map.put(color, flyWeight); return flyWeight; } } }
public static void main(String[] args) { FlyWeight f1 = FlyWeightFactory.get("白色"); FlyWeight f2 = FlyWeightFactory.get("白色"); f1.diplay(new Waibu("25", "25")); f2.diplay(new Waibu("50", "50")); }
白色和白色其实是一个对象不用创建两个,位置可由外部状态定义