享元(Flyweight)设计模式

一、享元模式以共享的方式高效地支持大量的细粒度对象java

二、Java中的String类型就是使用了享元模式设计

  • String对象是final类型,对象一旦建立就不可改变
  • JAVA会确保一个字符串常量在常量池中只有一个拷贝
String a = "abc";
        String b = "abc";
        System.out.println(a==b);//true
  • 这样的设计避免了在建立N多相同对象时所产生的没必要要的大量的资源消耗

三、享元模式的结构3d

  • 采用一个共享来避免大量拥有相同内容对象的开销
  • 享元对象能作到共享的关键是区分内蕴状态(Internal State)外蕴状态(External State)
  • 一个内蕴状态是存储在享元对象内部的,而且是不会随环境的改变而有所不一样;一个享元能够具备内蕴状态并能够共享
  • 一个外蕴状态是随环境的改变而改变的、不能够共享的
  • 享元对象的外蕴状态必须由客户端保存,并在享元对象被建立以后,在须要使用的时候再传入到享元对象内部
  • 外蕴状态不能够影响享元对象的内蕴状态,它们是相互独立的

四、享元模式能够分红单纯享元模式复合享元模式两种形式code

单纯享元模式  对象

  • 全部的享元对象都是能够共享的

  • 客户端调用
public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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");
    }

}
  • 执行结果
  • 申请了三个对象,实际建立的享元对象只有两个,这就是共享的含义

复合享元模式blog

  • 将一些单纯享元使用合成模式加以复合,造成复合享元对象
  • 这样的复合享元对象自己不能共享,可是它们能够分解成单纯享元对象,然后者则能够共享

  • 抽象享元角色类

  • 具体享元角色类

  • 复合享元对象是由单纯享元对象经过复合而成的

  • 享元工厂角色提供两种不一样的方法,一种用于提供单纯享元对象,另外一种用于提供复合享元对象

  • 客户端调取

  • 执行结果

结果说明内存

  • 一个复合享元对象的全部单纯享元对象元素的外蕴状态都是与复合享元对象的外蕴状态相等的。即外运状态都等于Composite Call
  • 一个复合享元对象所含有的单纯享元对象的内蕴状态通常是不相等的。即内蕴状态分别为b、c、a
  • 复合享元对象是不能共享的。即便用相同的对象compositeState经过工厂分别两次建立出的对象不是同一个对象
  • 单纯享元对象是能够共享的。即便用相同的对象state经过工厂分别两次建立出的对象是同一个对象

四、享元模式的优缺点资源

  • 享元模式的优势在于它大幅度地下降内存中对象的数量
  • 享元模式使得系统更加复杂。为了使对象能够共享,须要将一些状态外部化,这使得程序的逻辑复杂化
  • 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长
相关文章
相关标签/搜索