设计模式之——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出实例,而是通过尽 ...
随机推荐
- mongodb int字段的一个小坑
在使用 php mongodb 搜索时,如果字段类型用 int,则使用 php 搜索时一定要把数值转换成整型来搜索,用字符串类型的数字搜索是没有结果的!!!! $condition = ['membe ...
- linux 网卡配置信息
vi /etc/sysconfig/network-scripts/ifcfg-eth0
- 通过RF数据库查询中文字段结果正常显示的转换方法
方法1:统一显示为中文 1.通过RF数据库查询中文字段结果格式:'\xba\xcb\xbc\xf5\xcd\xa8\xb9\xfd' 2.通过Decode Bytes To String进行gbk解码 ...
- Nginx(八)-- 负载均衡
1.概念 负载均衡 建立在现有的网络结构上,提供一种廉价有效透明的方法来扩大网络设置和服务器的带宽.增加吞吐量.加强网络数据处理能力,以及提供网络的灵活性和可用性. 用得较多的负载均衡器硬件有F5 B ...
- requests 安装
requests 是用来发送 HTTP 请求的一个库,requests 是对 urllib 和 urllib2 进行封装的一个模块,用来取代 urllib 和 urllib2,可以使用以下两种方法安装 ...
- hadoop应用开发技术详解
<大 数据技术丛书:Hadoop应用开发技术详解>共12章.第1-2章详细地介绍了Hadoop的生态系统.关键技术以及安装和配置:第3章是 MapReduce的使用入门,让读者了解整个开发 ...
- warning C4305:“初始化”:从“double”到“float”截断
编译VS项目时出现警告: warning C4305:“初始化”:从“double”到“float”截断(warning C4305: 'initializing' : truncation from ...
- PHP 中文字符串截取
$str = "abcdef啊啊吧啊"; function my_sub($str, $st ,$len){ $ret = ""; for( $st; $len ...
- 微信小程序学习指南
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- Linux终端多用户通信实用命令
一 命令 1.1 write 该命令将当前终端(源)输入的字符拷贝至目标用户的终端,从而发送消息给系统中某个用户.用法如下: #write <user> <msg> [Ctr ...