設計模式之享元模式

  1. 什麼是享元模式(Flyweight)

    • 享元模式是池技術的重要實現方式
    • 使用共享對象可有效地支持大量的細粒度的對象,避免過多的對象造成內存溢出
  2. 享元模式:內部狀態和外部狀態

    • 內部狀態:保持不變的狀態,可以作爲共享的狀態
    • 外部狀態:一般隨着環境的狀態而改變的狀態
  3. 享元對象的角色

    • Flyweight 抽象享元角色,產品的抽象類,同時定義出對象的外部狀態和內部狀態的接口或實現。
    • ConcreteFlyweight 具體享元角色,具體的一個產品類,實現抽象角色定義的業務
    • unsharedConcreteFlyweight 不可共享的享元角色
    • FlyweightFactory 構造一個池容器,同時提供從池中獲取對象的方法。
  4. 示例代碼

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