什麼是享元模式(Flyweight)
- 享元模式是池技術的重要實現方式
- 使用共享對象可有效地支持大量的細粒度的對象,避免過多的對象造成內存溢出
享元模式:內部狀態和外部狀態
- 內部狀態:保持不變的狀態,可以作爲共享的狀態
- 外部狀態:一般隨着環境的狀態而改變的狀態
享元對象的角色
- Flyweight 抽象享元角色,產品的抽象類,同時定義出對象的外部狀態和內部狀態的接口或實現。
- ConcreteFlyweight 具體享元角色,具體的一個產品類,實現抽象角色定義的業務
- unsharedConcreteFlyweight 不可共享的享元角色
- FlyweightFactory 構造一個池容器,同時提供從池中獲取對象的方法。
示例代碼
package com.pattern.flyweight;
/**
* 享元模式,抽象類,定義基本的操作
* @author yjzhou
*/
public abstract class Flyweight {
//內部狀態
private String intrinsic;
//外部狀態
protected final String extrinsic;
public Flyweight(String extrinsic){
this.extrinsic = extrinsic;
}
//定義業務操作
public abstract void operate();
public void setIntrinsic(String intrinsic){
this.intrinsic = intrinsic;
}
public String getExtrinsic(){
return this.extrinsic;
}
public String getIntrinsic(){
return this.intrinsic;
}
}
package com.pattern.flyweight;
/**
* 具體的享元類,實現具體的操作
* @author yjzhou
*/
public class ConcreteFlyweight extends Flyweight {
public ConcreteFlyweight(String extrinsic) {
super(extrinsic);
}
@Override
public void operate() {
System.out.println(this);
}
@Override
public String toString() {
return super.getIntrinsic()+super.getIntrinsic();
}
}
package com.pattern.flyweight;
import java.util.HashMap;
import java.util.Map;
/**
* 享元工廠類,獲取需要的享元對象
* @author yjzhou
*/
public class FlyweightFactory {
//定義一個池容器
private static Map<String,Flyweight> pool = new HashMap<String, Flyweight>();
//享元工廠
public static Flyweight getFlyweight(String extrinsic){
//需要返回的對象
Flyweight flyweight = null;
if (pool.containsKey(extrinsic)){
flyweight = pool.get(extrinsic);
}else{
//根據外部狀態創建享元對象
flyweight = new ConcreteFlyweight(extrinsic);
//將對象放到池中
pool.put(extrinsic,flyweight);
}
return flyweight;
}
}