设计模式之享元模式

  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 pool = new HashMap();
    //享元工厂
    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;
    }
}

你可能感兴趣的:(设计模式,设计模式,享元模式,Flyweight,共享状态,池)