当前位置: 首页 > news >正文

享元模式flyweight

  • 享元模式属于结构型模式。

  • 享元模式是池技术的重要实现方式,它可以减少重复对象的创建,使用缓存来共享对象,从而降低内存的使用。

  • 细粒度的对象其状态可以分为两种:内部状态和外部状态。

应用场景
  • 系统存在大量相似或相同的对象。

  • 外部状态相同类似情况下。

  • 需要缓冲池时。

下面将由一个例子讲解享元模式的创建和使用:

假设我们有一个系统需要实现图形的绘制,通过形状划分,所有图形都可以实现绘制颜色的功能。这里形状是图形的内部状态,颜色是图形的外部状态,内部状态是不受外界条件影响而改变。

如果我要绘制白色的圆形,黑色的方形,红色的圆形,这个时候就可以使用享元模式,圆形共享一个对象,方形共享一个对象。

角色说明:
  • Flyweight --> IShape(抽象享元角色):接口或抽象类,可以同时定义出对象的外部状态和内部状态的接口或实现。

  • ConcreteFlyweight --> Circle,Rectangle(具体享元角色):实现抽象享元角色中定义的业务。

  • FlyweightFactory --> ShapeFactory(享元工厂):管理对象池和创建享元对象。

定义图形接口:

public interface IShape {void draw(String color);
}

圆形实现接口,实现圆形的绘制方法:

public class Circle implements IShape {String mShapeName = "圆形";@Overridepublic void draw(String color) {System.out.println("绘制" + mShapeName + ": " + color);}
}

方形实现接口,实现方形的绘制方法:

public class Rectangle implements IShape {String mShapeName = "方形";@Overridepublic void draw(String color) {System.out.println("绘制" + mShapeName + ": " + color);}
}

定义一个工厂类,创建缓存池和对应图形对象:

public class ShapeFactory {private Map<String, IShape> mShapeMap = new HashMap<>();public IShape getShape(Class<?> clazz) {IShape iShape = mShapeMap.get(clazz.getCanonicalName());if (iShape == null) {if (clazz == Circle.class) {System.out.println("创建Circle...");iShape = new Circle();} else if (clazz == Rectangle.class) {System.out.println("创建Rectangle...");iShape = new Rectangle();}mShapeMap.put(clazz.getCanonicalName(), iShape);}return iShape;}
}

具体调用:

public class TestMain {public static void main(String[] args) {ShapeFactory factory = new ShapeFactory();IShape circle = factory.getShape(Circle.class);circle.draw("white");IShape rectangle = factory.getShape(Rectangle.class);rectangle.draw("black");IShape circle2 = factory.getShape(Circle.class);circle2.draw("red");System.out.println("circle:" + circle.hashCode() + " rectangle:" + rectangle.hashCode() + " circle2:" + circle2.hashCode());}
}

可以看到circle和circle2的hashCode一致,说明他们指向了同一块内存空间,而rectangle是单独的hashCode。

其实还有一个例子也可以设计成享元模式:黑白棋。这个大家可以自己理解下~

优点:
  • 有共用数据不想多次创建时,可以实现对象共享,减少内存开销。

缺点:
  • 设计复杂,要区分内部状态和外部状态

Android中的享元模式:
  • String类:

String s1 = "abc";
String s2 = "abc";print(s1 == s2)  //这里s1和s2指向同一个引用,打印true
思考:

其实写到这里我有了一个疑问,享元模式是不是就是单例模式+工厂模式?

欢迎大家赐教~

http://www.lryc.cn/news/6156.html

相关文章:

  • Pulsar
  • 项目介绍 + 定长内存池设计及实现
  • Linux--线程安全的单例模式--自旋锁--0211
  • 图文解说S参数(进阶篇)
  • Sentinel源码阅读
  • 2023年浙江食品安全管理员考试真题题库及答案
  • Webstorm 代码没有提示,uniapp 标签报错
  • MySQL-Innodb引擎事务原理
  • Linux操作系统学习(了解环境变量)
  • 数据分析思维(六)|循环/闭环思维
  • C++:类和对象(下)
  • ASP.NET Core MVC 项目 AOP之IResultFilter和IAsyncResultFilter
  • jstack排查cpu占用高[复习]
  • 网络安全-Pyhton环境搭建
  • SpringBoot Mybatis 分页实战
  • 计算机断层扫描结肠镜和全自动骨密度仪在一次检查中的可行性
  • Java多级缓存是为了解决什么的?
  • MongoDB--》索引的了解及具体操作
  • Python open()函数详解:打开指定文件
  • CentOS Stream 9尝鲜安装教程
  • Ambire AdEx 2023 年路线图
  • 两种特征提取方法与深度学习方法对比的小型金属物体分类分析研究
  • 传奇私服搭建网站的几种方法
  • i.MX8MP平台开发分享(clock篇)- 各类clock的注册
  • java ssm计算机系统在线考试平台idea
  • C语言(字符串函数)
  • Maxwell工作流程详解
  • 13- EM算法与GMM高斯混合 (聚类算法) (算法)
  • 【新】华为OD机试 - 二叉树层次遍历(Python)| 刷完获取OD招聘渠道
  • 工作记录------@Accessors(chain = true)引起的BUG,Excel导入时获取不到值