java设计模式--享元模式

享元模式(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"));
    }

白色和白色其实是一个对象不用创建两个,位置可由外部状态定义

posted @ 2016-09-28 22:45  jentary  阅读(198)  评论(0编辑  收藏  举报