博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一看就懂的设计模式--享元模式
阅读量:2392 次
发布时间:2019-05-10

本文共 2776 字,大约阅读时间需要 9 分钟。

是什么?

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元

类别

结构模式

类图

享元模式类图

适用场景

1、系统中有大量对象。

2、这些对象消耗大量内存。
3、这些对象的状态大部分可以外部化。
4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
5、系统不依赖于这些对象身份,这些对象是不可分辨的。

关键

用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。用 HashMap 存储这些对象。

常见案例

1、jdk中 int类型的 -128~~127 不管是 == 或者 equals 返回的都会 true, 其内部就是吧 -128~~127的用IntegerCache 缓存起来了。非常典型的 享元模式。

优点

大大减少对象的创建,降低系统的内存,使效率提高。

缺点

提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

实现步骤

步骤 1

创建一个接口,颜色类接口

package com.pattern.flyweight_pattern;/** * Created by chen on 2018/3/26. * 

* Email 122741482@qq.com *

* Describe: */public interface Color {

void print();}

步骤2

创建实现接口的实体类,这里参照 int的 用ColorCache 命名。

package com.pattern.flyweight_pattern;/** * Created by chen on 2018/3/26. * 

* Email 122741482@qq.com *

* Describe: */public class ColorCache implements Color {

private String name; public ColorCache(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void print() { System.out.println("颜色是" + name); }}

步骤3

创建一个工厂,生成基于给定信息的实体类的对象。

package com.pattern.flyweight_pattern;import java.util.HashMap;/** * Created by chen on 2018/3/26. * 

* Email 122741482@qq.com *

* Describe: */public class ColorFactory {

private static final HashMap
colorleMap = new HashMap(); public static Color getColor(String name) { Color color1 = (Color)colorleMap.get(name); if(color1 == null) { System.out.print(name+" 颜色不存在..创建一个放到缓存中.."); color1= new ColorCache(name); colorleMap.put(name, color1); } return color1; }}

步骤4

使用该工厂,通过传递颜色信息来获取实体类的对象。

package com.pattern.flyweight_pattern;import java.util.ArrayList;import java.util.List;/** * * @author chen * @date 2018/3/26 * 

* Email 122741482@qq.com *

* Describe: */public class FlyWeightPatternDemo {

public static void main(String[] args){ List
name=new ArrayList
(); name.add("红色"); name.add("黄色"); name.add("蓝色"); name.add("紫色"); name.add("红色"); name.add("绿色"); for (String n :name){ Color color= ColorFactory.getColor(n); color.print(); } }}

步骤5

查看输出

红色  颜色不存在..创建一个放到缓存中..颜色是红色黄色  颜色不存在..创建一个放到缓存中..颜色是黄色蓝色  颜色不存在..创建一个放到缓存中..颜色是蓝色紫色  颜色不存在..创建一个放到缓存中..颜色是紫色颜色是红色绿色  颜色不存在..创建一个放到缓存中..颜色是绿色

最关键

在工厂类中 用 HashMap 存下实现类, 提供一个get方法,判断HashMap是否有对应的对象,没有就创建后,放到HashMap 再返回给客户端,客户端再次调用的时候,就直接从HashMap 中返回对象。

博客源码地址

我的官网

我的CSDN地址
我的简书地址
我的github
我的码云地址
阿里云优惠券

1.png

1.jpg

转载地址:http://cqoab.baihongyu.com/

你可能感兴趣的文章
DM7修改数据库参数
查看>>
Oracle ASM Partnership and Status Table
查看>>
Oracle 12CR2 Oracle Restart - ASM Startup fails with PRCR-1079
查看>>
In-Memory Column Store
查看>>
Oracle 12C ASM asmcmd amdu_extract
查看>>
Oracle AMDU- ASM Metadata Dump Utility
查看>>
C/C++程序中的profile
查看>>
一个更好的Post process结构,三角形代替四边形。
查看>>
利用Vertex shader实现Point Sprites
查看>>
图形处理器历史简介
查看>>
System Memory,AGP Memory and Video Memory in D3D.
查看>>
使用辅助库建立openGL编程环境
查看>>
使用Win32API开始openGL编程
查看>>
使用MFC开始openGL编程
查看>>
关于Gbuffer中的normal存储
查看>>
近距离观察Tone mapping.
查看>>
Physically based shading
查看>>
Color correction
查看>>
Temporal AA
查看>>
miniz compared to other real-time and high-ratio compressors
查看>>