二十一、享元模式

1. 何为享元模式

定义:通过共享已存在的对象,减少创建对象内存开销的设计模式被称为享元模式。

享元模式和单例模式像一对孪生兄弟,二者的表现方式非常相似,但二者的存在目的却不是一样的。

单例模式保证了整个应用生命周期内,同一个对象只会存在一份内存,并且任何时间都能被访问使用。

享元模式的目的是如果存在可以复用的对象,那么对象将被共享而不是创建新的对象。在iOS开发中,享元模式的最佳实践就是UITableView的复用机制——超出屏幕外的单元格统一被回收放到一个复用队列之中,等待着需要新的单元格时进行复用。

2. 情景设置

我们要开发一个小应用程序,在屏幕上随机显示花朵图案,我们要显示图2-1所示的6种花朵。画了很多朵这些花之后,屏幕就填满了花。我们的目标是用六个不同的实例,画很多的随机尺寸和位置的花。如果为屏幕上所画的每朵花创建一个实例,程序会占用很多内存。

图2-1
解决方案

使用享元模式来限制花朵实例的数量,让它不多于可选花朵类型的总数。对于图2-2中的类图这样的设计,需要一种享元工厂和一些享元产品。FlowerView是UIImageView的字类,用它可以绘制一幅花朵图案。这个程序所用的享元工厂称为FlowerFactory,它管理一个FlowerView实例池。尽管池中对象的类是FlowerView,但客户端址要求FlowerFactory返回UIView的实例。与让工厂返回UIImage型的最终产品相比,这样的设计更加灵活。因为要是由于某种原因,我们也需要能够自行绘制的花朵,而不只是显示固定的图像,那么几乎全部都要修改---那就麻烦了。UIView被看做任何需要在屏幕上绘图的事物的高层抽象。FlowerFactory可以返回任何UIView类的对象,而不会破坏系统。这就是针对接口编程,而不是针对实现编程的一个好处。

图2-2 享元模式的类图

  他们的静态关系如图2-3所示:

图2-3 作为享元的FlowerViw的类图

  FlowerFactory用flowerPool聚合了一个花朵池的引用,flowerPool是一个保存FlowerView所有实例的数据结构。FlowerFactory用flowerViewWithType:方法,以UIView的形式返回FlowerView的实例。如果池中没有所请求花朵的类型,就会创建一个新的FlowerView实例。

3. 代码实现

待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 享元模式是对象池的一种实现。类似于线程池,线程池可以避免不停的创建和销毁多个对象,消耗性能。享元模式也是为了减少内...
    喵了个呜s阅读 408评论 0 1
  • 1 场景问题# 1.1 加入权限控制## 考虑这样一个问题,给系统加入权限控制,这基本上是所有的应用系统都有的功能...
    七寸知架构阅读 2,592评论 1 57
  • 目录 本文的结构如下: 引言 什么是享元模式 模式的结构 典型代码 代码示例 单纯享元模式和复合享元模式 模式扩展...
    w1992wishes阅读 1,607评论 0 6
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 4,095评论 1 15
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,648评论 30 472

友情链接更多精彩内容