天天看点

java设计模式十之享元模式

前言:

    享元设计模式也叫轻量级模式,是把对象不变化的部分抽取出来形成一个对象,避免这个对象修改。享元的目的是为了减少不必要的内存消耗,通过共享技术,有效的实现了大量细粒度对象的复用。

内部状态:存储在享元对象内部,一般在构造对象时设置,不会随环境变化而改变,因此内部状态可以复用。

外部状态:随环境改变而改变,是不可以共享的状态,所以外部状态需要在使用时由客户端传入(会造成线程安全问题)

怎么实现:

抽象享元类:

具体享元类:

享元类工厂:控制实例的创建和共享

代码:

享元接口:

package com.xhx.designpattern;

/**
 * xuhaixing
 * 2018/6/21 23:04
 * 享元接口
 **/
public interface FlyWeight {
    void doing(String externalState);
}
           

享元具体类:

package com.xhx.designpattern;

/**
 * xuhaixing
 * 2018/6/21 23:05
 * 享元具体类
 **/
public class ConcreateFlyWeight implements FlyWeight{

    //内部状态
    private String name;
    public ConcreateFlyWeight(String name){
        this.name=name;
    }
    //外部状态  externalState
    public void doing(String externalState) {
        System.out.println("name="+name+" exterState="+externalState);
    }
}
           

享元工厂:负责创建和维护享元实例,放在map中,key为内部状态

package com.xhx.designpattern;

import java.util.concurrent.ConcurrentHashMap;

/**
 * xuhaixing
 * 2018/6/21 23:09
 **/
public class FlyWeightFactory {
    private static ConcurrentHashMap<String, FlyWeight> flyWeights = new ConcurrentHashMap<String, FlyWeight>();

    /**
     * 通过内部状态name保存对象,如果外部状态改变,会导致线程不安全问题
     * @param name
     * @return
     */
    public static  FlyWeight getFlyWeight(String name){
        if(flyWeights.get(name)==null){
            synchronized (flyWeights){
                if(flyWeights.get(name)==null){
                    FlyWeight flyWeight = new ConcreateFlyWeight(name);
                    flyWeights.put(name,flyWeight);
                }
            }
        }
        return flyWeights.get("name");
    }
}
           

java中的字符串就保存在String的常量池中

java设计模式十之享元模式

我的git代码地址

继续阅读