美文网首页
java设计模式11(享元模式)

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

作者: 刺风有道 | 来源:发表于2019-04-23 01:05 被阅读0次

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

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

    享元模式的结构和实现:
    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 <String,Object> 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(享元模式)

          本文链接:https://www.haomeiwen.com/subject/ksjpgqtx.html