《JAVA与模式》之享元模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述享元(Flyweight)模式的:

  Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。


Java中的String类型

  在JAVA语言中,String类型就是使用了享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝。String a="abc",其中"abc"就是一个字符串常量。

public class Test {

    public static void main(String[] args) {

        String a = "abc";
String b = "abc";
System.out.println(a==b); }
}

  上面的例子中结果为:true ,这就说明a和b两个引用都指向了常量池中的同一个字符串常量"abc"。这样的设计避免了在创建N多相同对象时所产生的不必要的大量的资源消耗。

享元模式的结构

  享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。享元对象能做到共享的关键是区分内蕴状态(Internal State)外蕴状态(External State)。

  一个内蕴状态是存储在享元对象内部的,并且是不会随环境的改变而有所不同。因此,一个享元可以具有内蕴状态并可以共享。

  一个外蕴状态是随环境的改变而改变的、不可以共享的。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。

  享元模式可以分成单纯享元模式复合享元模式两种形式。

单纯享元模式  

  在单纯的享元模式中,所有的享元对象都是可以共享的。

aaarticlea/png;base64,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" alt="" />

  单纯享元模式所涉及到的角色如下:

  ●  抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

  ●  具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

  ●  享元工厂(FlyweightFactory)角色 :本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

源代码

  抽象享元角色类

public interface Flyweight {
//一个示意性方法,参数state是外蕴状态
public void operation(String state);
}

  具体享元角色类ConcreteFlyweight有一个内蕴状态,在本例中一个Character类型的intrinsicState属性代表,它的值应当在享元对象被创建时赋予。所有的内蕴状态在对象创建之后,就不会再改变了。

  如果一个享元对象有外蕴状态的话,所有的外部状态都必须存储在客户端,在使用享元对象时,再由客户端传入享元对象。这里只有一个外蕴状态,operation()方法的参数state就是由外部传入的外蕴状态。

public class ConcreteFlyweight implements Flyweight {
private Character intrinsicState = null;
/**
* 构造函数,内蕴状态作为参数传入
* @param state
*/
public ConcreteFlyweight(Character state){
this.intrinsicState = state;
} /**
* 外蕴状态作为参数传入方法中,改变方法的行为,
* 但是并不改变对象的内蕴状态。
*/
@Override
public void operation(String state) {
// TODO Auto-generated method stub
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + state);
} }

  享元工厂角色类,必须指出的是,客户端不可以直接将具体享元类实例化,而必须通过一个工厂对象,利用一个factory()方法得到享元对象。一般而言,享元工厂对象在整个系统中只有一个,因此也可以使用单例模式。

  当客户端需要单纯享元对象的时候,需要调用享元工厂的factory()方法,并传入所需的单纯享元对象的内蕴状态,由工厂方法产生所需要的享元对象。

public class FlyweightFactory {
private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>(); 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) {
// 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");
} }

  虽然客户端申请了三个享元对象,但是实际创建的享元对象只有两个,这就是共享的含义。运行结果如下:

aaarticlea/png;base64,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" alt="" />

复合享元模式

  在单纯享元模式中,所有的享元对象都是单纯享元对象,也就是说都是可以直接共享的。还有一种较为复杂的情况,将一些单纯享元使用合成模式加以复合,形成复合享元对象。这样的复合享元对象本身不能共享,但是它们可以分解成单纯享元对象,而后者则可以共享。

  aaarticlea/png;base64,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" alt="" />

  复合享元角色所涉及到的角色如下:

  ●  抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

  ●  具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

  ●   复合享元(ConcreteCompositeFlyweight)角色 :复合享元角色所代表的对象是不可以共享的,但是一个复合享元对象可以分解成为多个本身是单纯享元对象的组合。复合享元角色又称作不可共享的享元对象。

  ●   享元工厂(FlyweightFactory)角色 :本角 色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有 一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个 合适的享元对象。

源代码

  抽象享元角色类

public interface Flyweight {
//一个示意性方法,参数state是外蕴状态
public void operation(String state);
}

  具体享元角色类

public class ConcreteFlyweight implements Flyweight {
private Character intrinsicState = null;
/**
* 构造函数,内蕴状态作为参数传入
* @param state
*/
public ConcreteFlyweight(Character state){
this.intrinsicState = state;
} /**
* 外蕴状态作为参数传入方法中,改变方法的行为,
* 但是并不改变对象的内蕴状态。
*/
@Override
public void operation(String state) {
// TODO Auto-generated method stub
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + state);
} }

  复合享元对象是由单纯享元对象通过复合而成的,因此它提供了add()这样的聚集管理方法。由于一个复合享元对象具有不同的聚集元素,这些聚集元素在复合享元对象被创建之后加入,这本身就意味着复合享元对象的状态是会改变的,因此复合享元对象是不能共享的。

  复合享元角色实现了抽象享元角色所规定的接口,也就是operation()方法,这个方法有一个参数,代表复合享元对象的外蕴状态。一个复合享元对象的所有单纯享元对象元素的外蕴状态都是与复合享元对象的外蕴状态相等的;而一个复合享元对象所含有的单纯享元对象的内蕴状态一般是不相等的,不然就没有使用价值了。

public class ConcreteCompositeFlyweight implements Flyweight {

    private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
/**
* 增加一个新的单纯享元对象到聚集中
*/
public void add(Character key , Flyweight fly){
files.put(key,fly);
}
/**
* 外蕴状态作为参数传入到方法中
*/
@Override
public void operation(String state) {
Flyweight fly = null;
for(Object o : files.keySet()){
fly = files.get(o);
fly.operation(state);
} } }

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

public class FlyweightFactory {
private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
/**
* 复合享元工厂方法
*/
public Flyweight factory(List<Character> compositeState){
ConcreteCompositeFlyweight compositeFly = new ConcreteCompositeFlyweight(); for(Character state : compositeState){
compositeFly.add(state,this.factory(state));
} return compositeFly;
}
/**
* 单纯享元工厂方法
*/
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) {
List<Character> compositeState = new ArrayList<Character>();
compositeState.add('a');
compositeState.add('b');
compositeState.add('c');
compositeState.add('a');
compositeState.add('b'); FlyweightFactory flyFactory = new FlyweightFactory();
Flyweight compositeFly1 = flyFactory.factory(compositeState);
Flyweight compositeFly2 = flyFactory.factory(compositeState);
compositeFly1.operation("Composite Call"); System.out.println("---------------------------------");
System.out.println("复合享元模式是否可以共享对象:" + (compositeFly1 == compositeFly2)); Character state = 'a';
Flyweight fly1 = flyFactory.factory(state);
Flyweight fly2 = flyFactory.factory(state);
System.out.println("单纯享元模式是否可以共享对象:" + (fly1 == fly2));
}
}

运行结果如下:

aaarticlea/png;base64,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" alt="" />

  从运行结果可以看出,一个复合享元对象的所有单纯享元对象元素的外蕴状态都是与复合享元对象的外蕴状态相等的。即外运状态都等于Composite Call。

  从运行结果可以看出,一个复合享元对象所含有的单纯享元对象的内蕴状态一般是不相等的。即内蕴状态分别为b、c、a。

  从运行结果可以看出,复合享元对象是不能共享的。即使用相同的对象compositeState通过工厂分别两次创建出的对象不是同一个对象。

  从运行结果可以看出,单纯享元对象是可以共享的。即使用相同的对象state通过工厂分别两次创建出的对象是同一个对象。

享元模式的优缺点

  享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:

  ●  享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

  ●  享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

《JAVA与模式》之享元模式的更多相关文章

  1. Java设计模式之《享元模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...

  2. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  3. java设计模式-----10、享元模式

    Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使 ...

  4. 《JAVA设计模式》之享元模式(Flyweight)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是 ...

  5. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员‍‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...

  6. Java设计模式:Flyweight(享元)模式

    概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...

  7. 七个结构模式之享元模式(Flyweight Pattern)

    定义: 运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小.将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作. 结构图 ...

  8. 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)

    结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题.   结构 ...

  9. 【转】Java设计模式之《享元模式》及应用场景

    享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在. 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用.这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我 ...

  10. Java设计模式(11)——结构型模式之享元模式(Flyweight)

    一.概述 概念 避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). UML简图 单纯享元模式 角色 抽象享元角色(Flyweight):定义享元子类公共接口 具体享元角色(Co ...

随机推荐

  1. Linux 网络编程八(epoll应用--大并发处理)

    //头文件 pub.h #ifndef _vsucess #define _vsucess #ifdef __cplusplus extern "C" { #endif //服务器 ...

  2. C# 延迟处理类 Lazy

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lazy ...

  3. 利用Chrome插件向指定页面植入js,劫持 XSS

    资源来自:http://www.2cto.com/Article/201307/225986.html 首页 > 安全 > 网站安全 > 正文 利用Chrome插件向指定页面植入js ...

  4. 关于matlab中特殊字符, 上标和下标

    'T=25\circC',(摄氏度) 下标用 _{下划线} 上标用^ (尖号) 希腊字母等特殊字符用 α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Ga ...

  5. [CareerCup] 14.3 Final Finally Finalize 关键字比较

    14.3 What is the difference between final, finally, and finalize? 这道题考察我们Java中的三个看起来很相似的关键字final,fin ...

  6. 第10章 系统级I/O

    第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出 ...

  7. 20145311利用gdb调试汇编代码

    利用GDB调试汇编代码 首先编写c语言原代码,我使用的是同学分析过的代码 #include<stdio.h>short addend1 = 1;static int addend2 = 2 ...

  8. Fedora 12 环境搭建

    又来折腾发行版了. 这一回是Fedora12,搞的挺艰难的 下载了Fedora-12-i386-DVD.iso,无论使用ultraiso还是dd都无法安装. 后来下载了一个ImageWriter.ex ...

  9. Flex的正则表达式匹配速度与手工代码的比较

    flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷 ...

  10. Git & Github 一页简明笔记

    由于小组工程需要使用git&github的版本控制来协作,但我对其使用并不熟悉,特此写篇一页的笔记放在手边,备随时查阅. 相信这种一页的简明笔记,对大家也是有帮助的.我的笔记总结自廖雪峰的Gi ...