java設計模式-享元模式

什麼是享元模式:
爲了節省內存,共享一個對象,提供內存使用率,享元模式的關鍵在於區分共享的內部狀態和非共享的外部狀態。

開發中常見的享元模式場景:
1.JDBC連接池,線程池
2.java String類的設計

享元模式例子:
實現的場景是遊戲中的飛機打出的子彈,子彈有級別和位置,級別狀態可以共享,而位置狀態不能共享。

/**
 * 子彈類
 * @author liuxg
 * @date 2016年5月27日 下午5:41:46
 */
public class Bullet {

    private String level ; //可以共享的狀態

    public Bullet(String level) {
        super();
        this.level = level;
    }


    /**
     * 發射子彈
     */
    public void send(Postion position){ //position不可以共享

        System.out.println(level + "發送 ->位置 :" + position.getX() + "," + position.getY());

    }


}

position類狀態不可以共享,因爲位置時時不一樣,position類如下

/**
 * 子彈位置
 * @author liuxg
 * @date 2016年5月27日 下午5:47:55
 */
public class Postion {

    private int x ;
    private int y;

    public Postion(int x, int y) {
        super();
        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;
    } 


}

我們這裏還是用了工廠模式,用來管理和創建子彈

/**
 * 子彈工廠類,用來創建子彈
 * @author liuxg
 * @date 2016年5月27日 下午5:42:09
 */
public class BulletFactory {

    private static Map<String, Bullet> map = new HashMap<String,Bullet>();//用於存放子彈

    /**
     * 發射子彈
     */
    public static Bullet getBullet(String level){
        Bullet b = null ;
        if (map.get(level) == null) {
            b = new Bullet("導彈");
            map.put(level, b);
        }else{
            b = map.get(level);
        }

        return b ; 
    }

}

客戶端我們就可以這麼調用了

public class Client {

    public static void main(String[] args) {

        Bullet b1 = BulletFactory.getBullet("導彈");
        b1.send(new Postion(12, 32));

        Bullet b2 = BulletFactory.getBullet("導彈");
        b2.send(new Postion(22, 22));

        System.out.println(b1 == b2);//b1和b2爲指向同一個地址


    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章