转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40021651

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

主要目的是实现对象的共享,即共享池。当系统中对象多的时候能够降低内存的开销。在某种程度上。你能够把单例看成是享元的一种特例。

一、uml建模:

二、代码实现

/**
* 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象。
*
* 主要目的是实现对象的共享,即共享池,当系统中对象多的时候能够降低内存的开销。 */
abstract class FlyWeight {
public abstract void method();
} /**
* 创建持有key的子类
*/
class SubFlyWeight extends FlyWeight {
private String key; public SubFlyWeight(String key) {
this.key = key;
} @Override
public void method() {
System.out.println("this is the sub method。and the key is " + this.key);
}
} /**
* 享元工厂:负责创建和管理享元对象
*/
class FlyweightFactory {
private Map<String, FlyWeight> map = new HashMap<String, FlyWeight>(); /**
* 获取享元对象
*/
public FlyWeight getFlyWeight(String key) {
FlyWeight flyWeight = map.get(key);
if (flyWeight == null) {
flyWeight = new SubFlyWeight(key);
map.put(key, flyWeight);
}
return flyWeight;
} /**
* 获取享元对象数量
*/
public int getCount() {
return map.size();
}
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
/**
* 创建享元工厂
*/
FlyweightFactory factory = new FlyweightFactory();
/***** 第一种情况:key同样时 ***************/
FlyWeight flyWeightA = factory.getFlyWeight("aaa");
FlyWeight flyWeightB = factory.getFlyWeight("aaa");
/**
* 透过打印结果为true能够知道: 因为key都为"aaa",所以flyWeightA和flyWeightB指向同一块内存地址
*/
System.out.println(flyWeightA == flyWeightB);
flyWeightA.method();
flyWeightB.method();
/**
* 享元对象数量:1
*/
System.out.println(factory.getCount()); /***** 另外一种情况:key不同样时 ***************/
System.out.println("\n======================================");
FlyWeight flyWeightC = factory.getFlyWeight("ccc");
/**
* 打印结果为false
*/
System.out.println(flyWeightA == flyWeightC);
flyWeightC.method();
/**
* 享元对象数量:2
*/
System.out.println(factory.getCount());
}
}

打印结果:

true

this is the sub method,and the key is aaa

this is the sub method。and the key is aaa

1

======================================

false

this is the sub method,and the key is ccc

2

三、总结

享元与单例的差别:1、与单例模式不同。享元模式是一个类能够有非常多对象(共享一组对象集合),而单例是一个类仅一个对象;2、它们的目的也不一样,享元模式是为了节约内存空间,提升程序性能(避免大量的new操作),而单例模式则主要是共享单个对象的状态及特征。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Java设计模式偷跑系列(21)建模和实现享受metapatterns的更多相关文章

  1. Java设计模式偷跑系列(六)Singleton模式的建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403 单例模式(Singleton):是一种经常使用的设计模式. 在Java应用中 ...

  2. Java设计模式偷跑系列(十八)建模和责任链模式的实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一 ...

  3. Java设计模式偷跑系列(十二)组合模式建模和实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-总体模式.将对象组合成 ...

  4. Java设计模式菜鸟系列(一)策略模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563 今天開始咱们来谈谈Java设计模式. 这里会结合uml图形来解说,有对uml ...

  5. Java设计模式(21)访问模式(Visitor者模式)

    Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...

  6. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  7. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

  8. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  9. Java 设计模式系列(二三)访问者模式(Vistor)

    Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...

随机推荐

  1. UVA305 - Joseph(数论 + 打表)

    UVA305 - Joseph(数论 + 打表) 题目链接 题目大意:约瑟夫环问题:n个人围成一圈,每次都淘汰第m个人,问最后一个幸存下来的人的编号. 这题的意思有点不一样,它规定前面的k个人是好人, ...

  2. Java他们其中一个IO(一)

    1.I/O 操作的目标 其中从数据源读取数据,和写数据到的目标位置数据. 2.IO 的分类方法 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc ...

  3. 【Java 之 JVM】Java内存结构概述

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWl3dXpoaWxpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  4. 【网络流量最大流量】poj3281Dining

    /* EK算法版本号,哦,慢.....见下文dinic版本号 ----------------------------------------- 最大的问题是网络流量问题 -------------- ...

  5. struts2移除标签button的id传统的价值观念问题

    <!--显示数据列表--> <tbody id="TableData" class="dataContainer" datakey=" ...

  6. java实现线性链表结构

    package com.hephec.ds; public class LinkedList<T> { //定义一个内部类节点Node Node实例代表链表的节点 class Node{ ...

  7. Socket规划中的局域网内测试

    前面提到的Socket信息及文件传输软件,如何测试和使用它? 事实上仅仅要推断client及server的局域网连通就可以. 1.Server在cmd下输入 ipconfig/all获得IP地址或者本 ...

  8. javascript实现函数的默认參数值方法

    近期在学python,得益于python中的decorator思路,想到在javascript中參数是不能定义默认值的,可是能够通过decorator给它模拟出来,话不多说,上代码 <!DO ...

  9. 举例说,Linux核心名单(两)

    使用列表 我认为最好的方式,成为熟悉的核心列表功能是看一些简单的例子,素材去更好的理解链表. 以下是一个样例.包括创建.加入.删除和遍历链表. <span style="font-si ...

  10. jquery之ajax中国乱码的解决方案

    $.ajax({ dataType : 'json',type : 'POST',url : 'http://localhost/test/test.do',data : {id: 1, type: ...