用来尽可能减少内存使用量,适用于存在大量重复对象的场景,达到对象共享,避免创建过多对象的效果,提升性能,避免内存溢出。

定义:

使用共享对象有效支持大量细粒度对象。

适用场景:

  1. 系统中存在大量相似对象;
  2. 细粒度对象具备接近外部状态,内部状态与环境无关;
  3. 需要缓冲池。

亨元模式其实是通过集合来缓冲对象,获取的时候,先判断集合里面是否存在该对象,如果有就取出来,没有创建新的,避免不必要的对象创建。

简单例子:

接口类:

public interface Ticket {
public void showTicketInfo(String bunk);
}

接口实现类:

public class AirTicket implements Ticket {
public String from;
public String to;
public String bunk;
public int price; public AirTicket(String from, String to) {
this.from = from;
this.to = to;
} @Override
public void showTicketInfo(String bunk) {
price = new Random().nextInt(300);
System.out.println("从" + from + "到" + to + "的" + bunk + "价格:" + price);
}
}

亨元工厂类,创建对象池,创建亨元对象:

public class AirTicketFactory {
public static Map<String, Ticket> tickets = new ConcurrentHashMap<String, Ticket>(); /**
* 亨元模式具体体现,缓冲对象数据,减少对象创建
* @param from
* @param to
* @return
*/
public static Ticket getTicket(String from, String to) {
String key = from + "-" + to;
if (tickets.containsKey(key)) {
return tickets.get(key);
}else {
AirTicket airTicket = new AirTicket(from, to);
tickets.put(key, airTicket);
return airTicket;
}
}
}

测试类:

public class Main {

    public static void main(String[] args) {
Ticket toXianAirTicket0 = AirTicketFactory.getTicket("深圳", "西安");
Ticket toBeiJingAirTicket = AirTicketFactory.getTicket("深圳", "北京");
Ticket toXianAirTicket1 = AirTicketFactory.getTicket("深圳", "西安");
Ticket toXianAirTicket2 = AirTicketFactory.getTicket("深圳", "西安"); toXianAirTicket0.showTicketInfo("头等舱");
toBeiJingAirTicket.showTicketInfo("商务舱");
toXianAirTicket1.showTicketInfo("头等舱");
toXianAirTicket2.showTicketInfo("头等舱");
}
}

结果:

从深圳到西安的头等舱价格:114
从深圳到北京的商务舱价格:215
从深圳到西安的头等舱价格:231
从深圳到西安的头等舱价格:103

设计模式 -- 亨元模式(FlyWeight Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  2. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  3. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

  5. Java享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...

  6. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

  7. 设计模式-享元模式(FlyWeight)

    一.概念 享元模式是对象的结构模式,它以共享的方式高效的支持大量的细粒度对象,减少对象的数量,并达到节约内存的目的. 享元对象能够做到共享的关键,主要是区分了内部状态和外部状态,内部状态是对象是在建立 ...

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

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

  9. 享元模式(Flyweight Pattern)

    定义: 采用一个共享来避免大量拥有相同内容对象的开销.这种开销中最常见.直观的就是内存的损耗.享元模式以共享的方式高效的支持大量的细粒度对象. 享元的英文是flyweight,是一个来自体育方面的专业 ...

随机推荐

  1. Hudson+Maven+Svn搭建持续集成环境

    Hudson+Maven+Svn搭建持续集成环境 博客分类: 配置管理 mavenSVNTomcat项目管理配置管理 一.所用开发工具 1.    Hudson: Hudson 是一种革命性的开放源码 ...

  2. 【转载】Android中ListView下拉刷新的实现

    在网上看到一个下拉刷新的例子,很的很棒,转载和更多的人分享学习 原文:http://blog.csdn.net/loongggdroid/article/details/9385535 ListVie ...

  3. 使用Java编写的B*算法

    package rpg.stage.path; import java.util.ArrayList; import java.util.HashSet; import java.util.Itera ...

  4. 搭建开发框架Express,实现Web网站登录验证

    NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证   JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需 ...

  5. every、some、filter、map、forEach 方法的区别总结

    API功能描述: [every]:Boolean 遍历数组并执行回调,如果每个数组元素都能通过回调函数的测试则返回true,否则返回false.一旦返回false,将立即终止循环. [some]:Bo ...

  6. 如何使ActionBar不那么单调

    此时我没有生产博客,此时我只是优秀博客的搬运工! 博客原址,有兴趣的可以查看一下. 详情如下: 使ActionBar不那么单调 回到2013年5月份,每一个人都发觉了Play Music中Action ...

  7. Algorithm lecture

    当前标签: lecture   组合数求法讲解 BLADEVIL 2014-01-08 18:59 阅读:3 评论:0     mobius反演讲解 BLADEVIL 2014-01-08 18:13 ...

  8. ScriptCase升级到7.01

    今天打开ScriptCase的开发环境,发现有新的升级,联网自动升级后,发现已经升级到7.01版本. 7.01版本对界面进行了优化,菜单和图标均以立体的形式进行展现. 不过粗粗看了一下,翻译还是有很多 ...

  9. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

  10. jquery 实现飘落效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...