java设计模式11(享元模式)

享元模式:当系统中存在大量相同或者相似的对象时,通过共享技术实现相同或相似的细粒度对象的复用,从而节约了内存空间,提高了系统性能。在享元模式中提供了一个享元池用于储存已经创建好的享元对象,并通过享元工厂类将享元对象提供给客户端使用。

享元模式的定义:运用共享技术有效地支持大量细粒度对象的复用。

享元模式的结构和实现:
1.Flyweight(抽象享元类):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类的公共方法,这些方法可以向外界提供享元对象的内部数据,同时可以设置外部数据。

public abstract class Flyweight {

    public abstract void operation(String state);

}

2.ConcreteFlyweight(具体享元类):具体享元类实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了储存空间。通常可以结合单例模式来设计具体享元类,为每一个具体享元类提供了唯一享元对象。

public class ConcreteFlyweight extends Flyweight {
    
    private String intrState;
    
    public ConcreteFlyweight(String intrState) {
        this.intrState = intrState;
    }

    @Override
    public void operation(String state) {
        System.out.println("具体享元类中业务"+intrState);
    }

}

3.UnsharedConcreteFlyweight(非共享具体享元类):并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类,需要使用时直接实例化创建。

public class UnsharedConcreteFlyweight extends Flyweight {

    @Override
    public void operation(String state) {
        System.out.println("非共享具体享元类业务方法!");
    }

}

4.FlyweightFactory(享元工厂类):享元工厂用于创建并管理享元对象,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合或其他类型的集合。

public class FlyweightFactory {
    
    //定义享元池
    private Map  map=new HashMap<>();
    
    public Flyweight getFlyweight(String key) {
        //获取享元池中的对象,不存在则创建,同时添加对象到享元池中。
        if(map.containsKey(key)){
            return (Flyweight) map.get(key);
        }else {
            Flyweight flyweight=new ConcreteFlyweight("");
            map.put(key, flyweight);
            return flyweight;
        }
    }

}

5.Test:

public class Test {

    public static void main(String[] args) {
        Flyweight flyweightA,flyweightB;
        FlyweightFactory factory=new FlyweightFactory();
        flyweightA=factory.getFlyweight("testA");
        flyweightB=factory.getFlyweight("testA");
        System.out.println("判断返回对象是否相同:"+(flyweightA==flyweightB));
        //true
    }
    
}

你可能感兴趣的:(java设计模式11(享元模式))