享元模式

享元模式介绍
 享元模式是对象池的一种实现,它的英文名称叫做Flyweight,代表轻量的意思,享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果,这样一来就可以提升性能、避免内存移除等。
 享元模式中的部分状态是可以共享,可以共享的状态成为内部状态,内部状态不会随着环境变化;不可共享的状态则称之为外部状态,它们会随着环境的改变而改变。在享元模式中会建立一个对象容器,在经典的享元模式中该容器为一个Map,它的键是享元对象的内部状态,它的值就是享元对象本身。客户端程序通过这个内部状态从享元工厂中获取享元对象,如果有缓存则使用缓存对象,否则创建一个享元对象并且存入容器中,这样一来就避免了创建过多对象的问题。

享元模式定义
 使用共享对象可有效地支持大量的细粒度的对象。

享元模式的使用场景
 1.系统中存在大量的相似对象
 2.细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
 3.需要缓冲池的场景
 
享元模式的UML类图
 这里写图片描述
 角色介绍。
 Flyweight:享元对象抽象基类或接口
 ConcreteFlyweight:具体的享元对象
 FlyweightFactory:享元工厂,负责管理享元对象池和创建享元对象。
享元对象的简单示例:

//抽象接口
public interface Flyweight {
    public void operation(String state);
}
//具体的享元角色类
public class ConcreteFlyweight implements Flyweight {

    private Character intrinsincState = null;

    /**
     * 外蕴状态做为参数传入方法中,改变方法的行为,
     * 但是并不改变对象的内蕴状态
     */
    @Override
    public void operation(String state) {
        System.out.println("Intrinsic State = " + this.intrinsincState);
        System.out.println("Extrinsic State = " + state);
    }
    /**
     * 构造函数,内蕴状态做为参数传入
     * @param state
     */
    public ConcreteFlyweight(Character state) {
        this.intrinsincState = state;

    }

}

//享元工厂角色类
public class FlyweightFactory {
    private Map<Character, Flyweight> files = new HashMap<>();

    public Flyweight factory(Character state){
        //从缓存中查找对象
        Flyweight fly = files.get(state);
        if (fly == null) {
            //如果对象不存在则创建一个新的Flyweight对象
            fly = new ConcreteFlyweight(state);
            //把这个新的Flyweight对象添加到缓存中
            files.put(state, fly);
        }

        return fly;
    }
}

//测试类
public class Client {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly = factory.factory(new Character('a'));
        fly.operation("First Call");

        fly = factory.factory(new Character('b'));
        fly.operation("Second Call");

        fly = factory.factory(new Character('a'));
        fly.operation("Third Call");
    }
}

Intrinsic State = a
Extrinsic State = First Call
Intrinsic State = b
Extrinsic State = Second Call
Intrinsic State = a
Extrinsic State = Third Call

总结
 享元模式的优点在于它大幅度的降低内存中对象的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值