什麼是享元模式:
爲了節省內存,共享一個對象,提供內存使用率,享元模式的關鍵在於區分共享的內部狀態和非共享的外部狀態。
開發中常見的享元模式場景:
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爲指向同一個地址
}
}