设计模式之——flyweight模式
flyweight模式,又叫做享元模式。
顾名思义,享元模式就是共享一个元素。
百度百科 解释为:
享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
本次示例就是以一个球的类,作为元素,来展示享元模式的。
- 球的类
package site.wangxin520.gof.flyweight; /**
* 享元模式里面的“元”
* @author wangXgnaw
*
*/
public class Ball { private String name; //构造函数,传入球的名称
public Ball(String name){
this.name=name;
} //打球
public void play(){ System.out.println("打"+name+";"); } }
- 球的工厂类
package site.wangxin520.gof.flyweight; import java.util.HashMap;
import java.util.Map; /**
* 用一个球类的工厂,用来创造球
* 因为享元模式就是共享同一个元素嘛,所以在工厂里面
* @author wangXgnaw
*
*/
public class BallFactory { private static BallFactory ballFactory=new BallFactory(); //用于保存已经创建好了的球类
private Map<String, Ball> balls; //私有化构造
private BallFactory(){
balls=new HashMap<>();
} /**
* 返回一个实例,这里让球工厂类变成了一个单例类
* @return BallFactory 返回一个球类工厂
*/
public static BallFactory getInstance(){
return ballFactory;
} /**
* 创建一个球
* @param ballName 球的名称
* @return Ball 返回一个球类的实例
*/
public Ball createBall(String ballName){
//当map里面包含的话,直接返回,省去再创建实例,浪费资源
if(balls.containsKey(ballName)){
return balls.get(ballName);
}
//如果map里面没有,那么就创建实例,并且保存到map里面,方便下次调用
Ball ball = new Ball(ballName);
balls.put(ballName, ball);
return ball;
} }
- 享元模式的测试类
package site.wangxin520.gof.flyweight; /**
* 享元模式的测试类
*
* @author wangXgnaw
*
*/
public class Test { public static void main(String[] args) { // 原本情况
//创建一号乒乓球
Ball football_01=new Ball("乒乓球");
football_01.play();
//创建二号乒乓球
Ball football_02=new Ball("乒乓球");
football_02.play();
System.out.println("两个乒乓球是同一个对象么?"+(football_01==football_02)); System.out.println("--------------------------------"); // 享元模式下
// 创建工厂
BallFactory ballFactory = BallFactory.getInstance();
// 创建一号篮球
Ball basketBall_01 = ballFactory.createBall("篮球");
basketBall_01.play();
// 创建二号篮球
Ball basketBall_02 = ballFactory.createBall("篮球");
basketBall_02.play();
System.out.println("两个篮球是同一个对象么?"+(basketBall_01==basketBall_02));
} }
- 控制台输出为:

可见,同样是打球,可是两种获取示例的方式,得到的球的对象却是不一样的!想打球的次数多的话,调用同一个类是一种明智的选择,这样可以节省大量的资源。因为我们都知道,不可能每次打球,都去重新买一个球吧。哈哈哈!
设计模式之——flyweight模式的更多相关文章
- 设计模式之Flyweight模式(笔记)
享元模式:运用共享技术有效地支持大量细粒度的对象. 适用场合:假设一个应用程序适用了大量的对象.而大量的这些对象造成了非常大的存储开销时就应该考虑使用. 首先定义一个IFlyweight接口 publ ...
- Java设计模式-享元模式(Flyweight)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...
- 面向对象设计模式之Flyweight享元模式(结构型)
动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...
- 设计模式---对象性能模式之享元模式(Flyweight)
一:概念 通过与其他类似对象共享数据来减少内存占用 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字 ...
- Flyweight模式_Java中23种设计模式
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 享元模式: Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用 ...
- Java设计模式(5)共享模式/享元模式(Flyweight模式)
Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...
- 设计模式之flyweight享元模式
运用共享技术支持大量细粒度对象的使用 Flyweight模式(享元) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模 ...
- 常见设计模式解析和实现(C++)FlyWeight模式
作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...
- 设计模式(二十)Flyweight模式
当使用new关键字生成类的实例时,需要给其分配足够的内存空间.当程序中需要大量对象时,如果都是用new关键字来分配内存,将会消耗大量内存空间.Flyweight模式就是尽量避免new出实例,而是通过尽 ...
随机推荐
- ios开发之--仿(微信)自定义表情键盘
先附上demo:https://github.com/hgl753951/CusEmoji.git 效果图如下:
- Cesium添加水面
var viewer = new Cesium.Viewer('cesiumContainer');var waterPrimitive = new Cesium.Primitive({ //show ...
- rabbitMQ常用的命令
rabbitMQ常用的命令 启动监控管理器:rabbitmq-plugins enable rabbitmq_management 关闭监控管理器:rabbitmq-plugins disable r ...
- IntelliJ IDEA:Field injection is not recommended
使用IntelliJ IDEA进行开发的时候,code analyze的时候会出现提示“Field injection is not recommended”. stackoverflow上有篇回答: ...
- 【技术分享会】 @第三期 CSS框架 PRUE 实现自适应和响应式
Pure网址:https://purecss.cn/ 什么是响应式和自适应? .响应式:样式会随着屏幕大小改变,同一页面设备不同样式不同 .自适应:不管屏幕大小,页面的样式比例不变 响应式和自适应怎么 ...
- SQL SERVER 2008 R2安全配置与防暴力破解
https://blog.csdn.net/enweitech/article/details/49864215 0x00 sql server 2008 权限介绍 在访问sql server 200 ...
- openlayers中利用vector实现marker的方式
项目需要一个小型的gis.openlayers,geoserver,postgres组合是比较好的选择. openlayers的marker层好像不支持拖动操作.通过研究api发现,可以利用vecto ...
- webstorm启动报错
环境: 在重装完系统的电脑上第一次安装webstorm, 问题: 解决”failed to load jvm dll“的报错问题: 解决方案: 安装Microsoft Visual C++ 2010 ...
- sencha touch list 选择插件,可记忆已选项,可分组全选
选择记忆功能参考:https://market.sencha.com/extensions/ext-plugin-rememberselection 插件代码: /* * 记住列表选择状态 * 如果分 ...
- sphinx配置文件详解
sphinx的配置文件是在配置的时候最容易出错的了: 我们先要明白几个概念: source:数据源,数据是从什么地方来的. index:索引,当有数据源之后,从数据源处构建索引.索引实际上就是相当于一 ...