文档章节

【结构型】- 享元模式

ZeroneLove
 ZeroneLove
发布于 02/18 23:05
字数 566
阅读 15
收藏 0

享元模式


作用:利用共享技术有效地支持大量细粒度对象的复用

享元模式状态


  • 内部状态:在享元对象内部不随外界环境改变而改变的共享部分,存储于享元对象内部

  • 外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态,客户端存储

角色


  • Flyweight(抽象享元类): 具体享元类的超类或接口,用于接受并作用于外部状态

  • ConcreteFlyweight(具体享元类): 指定内部状态,为内部状态增加存储空间

  • UnsharedConcreteFlyweight(非共享具体享元类: 指出不需要共享的Flyweight子类

  • FlyweightFactory(享元工厂类): 用于创建并管理Flyweight对象,来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory会提供一个已经创建的Flyweight对象或者新建一个(如果不存在)。

案例


抽象享元类:FlyWeight

package com.zhiwei.flyweight;
public abstract class FlyWeight {
    public abstract void show();
}

具体享元类:ConcreteFlyWeight

package com.zhiwei.flyweight;
public class ConcreteFlyWeight extends FlyWeight{  
	private String name;  
    public ConcreteFlyWeight(String name){  
        this.name = name;  
    }  
  
    @Override
    public void show() {  
        System.out.println("享元对象:"+name);  
    }  
}  

享元工厂类:FlyWeightFactory

package com.zhiwei.flyweight;

import java.util.HashMap;
import java.util.Map;
public class FlyWeightFactory {
	
    private static Map<String, FlyWeight> flyWeightObjects = new HashMap<String, FlyWeight>();

    public static FlyWeight getConcreteFlyWeight(String name) {
        
        FlyWeight flyWeightObject = flyWeightObjects.get(name); 
        boolean flag = true; 
        
        if (flyWeightObject == null) {
            flag = false;
            flyWeightObject = new ConcreteFlyWeight(name);
            flyWeightObjects.put(name, flyWeightObject);
        }
        
        if(flag){
            System.out.println("对象共享池中获取:" + name);
        }else{
            System.out.println("享元对象被创建:" + name);
        }
        return flyWeightObject;
    }

    public static int getSum() {
        return flyWeightObjects.size();
    }
}

测试代码:

FlyWeight flyWeight = FlyWeightFactory.getConcreteFlyWeight("轿车");  
flyWeight.show();

System.out.println("---------------------------");

flyWeight = FlyWeightFactory.getConcreteFlyWeight("卡车");  
flyWeight.show();

System.out.println("---------------------------");

flyWeight = FlyWeightFactory.getConcreteFlyWeight("轿车");
flyWeight.show();

System.out.println("---------------------------");

System.out.println("享元工厂共享池对象  数量:"+FlyWeightFactory.getSum());

效果:

享元模式分析

享元模式实现资源复用,享元工厂维护一个享元对象的对象共享池,按照需求进行存取,减少对象的频繁创建,提高系统的性能,类似缓存机制

© 著作权归作者所有

ZeroneLove
粉丝 6
博文 164
码字总数 133695
作品 0
深圳
高级程序员
私信 提问
设计原则和设计模式_Index

设计原则 1.1 什么是设计原则 ?(https://my.oschina.net/jimilee/blog/732569) 1.2 设计原则如何用? 1.3 设计原则详解 1.4 30分钟快速理解面向对象设计原则 2. 设计模式 2.1 什么时候使用设...

无寄语
2016/08/14
1
0
享元(Flyweight Pattern)模式

Flyweight在拳击比赛中指最轻量级,选择使用“享元模式”的意译,是因为这样更能反映模式的用意。 享元模式的用意 享元模式对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象...

叶知秋
2013/07/01
186
0
Java设计模式学习记录-享元模式

前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了)。享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直...

纪莫
2018/08/15
0
0
设计模式-实现对象的复用——享元模式

享元模式概述 当一个系统中运行时产生的对象数量太多, 将导致运行代价过高, 带来系统性能下降的问题. 享元模式: 运用共享技术有效的支持大量细粒度对象的复用. 系统只使用少量的对象, 而这些...

hell03W
2016/12/09
22
0
好程序员分享java设计模式之享元模式

Java设计模式中的享元模式。享元模式有点类似于单例模式,都是只生成一个对象被共享使用。享元模式主要目的就是让多个对象实现共享,减少不必要的内存消耗,将多对同一对象的访问集中起来,不...

好程序员IT
05/23
3
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
9
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
7
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
7
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部