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模式的更多相关文章

  1. 设计模式之Flyweight模式(笔记)

    享元模式:运用共享技术有效地支持大量细粒度的对象. 适用场合:假设一个应用程序适用了大量的对象.而大量的这些对象造成了非常大的存储开销时就应该考虑使用. 首先定义一个IFlyweight接口 publ ...

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

    享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...

  3. 面向对象设计模式之Flyweight享元模式(结构型)

    动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...

  4. 设计模式---对象性能模式之享元模式(Flyweight)

    一:概念 通过与其他类似对象共享数据来减少内存占用 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字 ...

  5. Flyweight模式_Java中23种设计模式

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 享元模式: Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用 ...

  6. Java设计模式(5)共享模式/享元模式(Flyweight模式)

    Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...

  7. 设计模式之flyweight享元模式

    运用共享技术支持大量细粒度对象的使用 Flyweight模式(享元) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模 ...

  8. 常见设计模式解析和实现(C++)FlyWeight模式

    作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...

  9. 设计模式(二十)Flyweight模式

    当使用new关键字生成类的实例时,需要给其分配足够的内存空间.当程序中需要大量对象时,如果都是用new关键字来分配内存,将会消耗大量内存空间.Flyweight模式就是尽量避免new出实例,而是通过尽 ...

随机推荐

  1. ios开发之--数组的一些操作

    1,创建数组 NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@"b" ...

  2. 【代码审计】iZhanCMS_v2.1 前台存储型XSS漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  3. PHP MYSQL 分表方法

    function get_hash_table($table,$uid){ $_str = crc32($uid); if($_str < 0 ){ $ret = "0".s ...

  4. javascript的fn方法(转)

    jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展j ...

  5. 分布式实时日志系统(一)环境搭建之 Jstorm 集群搭建过程/Jstorm集群一键安装部署

    最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...

  6. MySQL对数据表进行分组查询(GROUP BY)

    MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVI ...

  7. 跟bWAPP学WEB安全(PHP代码)--SQL注入的一些技巧

    背景 模拟环境还是 bWAPP,只不过这个bWAPP的SQL注入有点多,一一写意义不大,在这边就利用这个环境来尝试一些SQL注入的技巧.并研究下PHP的防御代码. 普通的bWAPPSQL注入的简单介绍 ...

  8. Sass预定义一些常用的样式

    一.编写sass文件时, 目录不能有中文, 如: E:\\CPC手机, 会报错exception while processing events: incompatible character enc ...

  9. ASP.NET MVC View使用Conditional compilation symbols

    由于View(.cshtml)的运行时编译关系,在项目级别中定义的symbols是无法被直接使用的.需要在Web.config中添加compilerOptions(在View目录下的Web.confi ...

  10. 学会阅读Java字节码

    1.Class文件基础   (1)文件格式     Class文件的结构不像XML等描述语言那样松散自由.由于它没有任何分隔符号, 所以,以上数据项无论是顺序还是数量都是被严格限定的.哪个字节代表什么 ...