设计模式之——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出实例,而是通过尽 ...
随机推荐
- MySQL开发面试题
……继上一篇MySQL的开发总结之后,适当的练习还是很有必要的…… SQL语法多变,不敢保证唯一,也不敢保证全对,如果错误欢迎指出,即刻修改. 一.现有表结构如下图 TABLENAME:afinfo ...
- Mybatis数据库连接报错:对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
Mybatis数据库连接报错:对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 ============================== 蕃薯耀 ...
- unity3d抛物线的脚本
using UnityEngine; using System.Collections; public class ProjectileTest : MonoBehaviour { public Ga ...
- u3d 加密资源并缓存加载
// C# Example // Builds an asset bundle from the selected objects in the project view. // Once compi ...
- Streaming 101
开宗明义!本文根据Google Beam大神Tyler Akidau的系列文章<The world beyond batch: Streaming 101>(批处理之外的流式世界)整理而成 ...
- 中文解码Unicode
package com.j1.search.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder ...
- 客户端远程连接linux下mysql数据库授权
mysql默认状态是只支持localhost连接,这样远程服务器都输入IP地址去连接你的服务器是不可以的,下面我来介绍怎么让mysql允许远程连接配置方法,有需要的朋友可参考. 方法一,直接利用p ...
- hadoop完全分布式搭建HA(高可用)
2018年03月25日 16:25:26 D调的Stanley 阅读数:2725 标签: hadoop HAssh免密登录hdfs HA配置hadoop完全分布式搭建zookeeper 配置 更多 个 ...
- ANDROID – 單色漸層效果的改良 – GRADIENT SCRIMS(转)
本篇是根據 +Roman Nurik 在 2014/11/24 發佈的一篇 G+ 而來.看到他發文後,起了好奇心,就根據他提出的方法嘗試著實作,並將之排列呈現,直接從視覺上做個比較. 他在 G+ 的發 ...
- 【docker】使用docker 安装 宝塔面板
拉取centos基础镜像,用容器启动该基础镜像,直接在这个容器中部署 1 拉取纯净系统镜像 docker pull centos: 2 启动镜像,映射主机与容器内8888端口 docker run - ...