美文网首页iOS Swift 5.2 设计模式
Swift 5.2 Flyweight Pattern 共享轻量

Swift 5.2 Flyweight Pattern 共享轻量

作者: Sunooo | 来源:发表于2020-07-10 09:05 被阅读0次

    在开发中,有很多一模一样的对象,要重复使用很多次,如果每次使用的时候,都创建一个新的对象,都会浪费内存空间。
    如果这样说,你是不是就想到了单例模式,单例模式就是使用一个对象打全场。
    但是这次说的不是单例模式,是Flyweight Pattern,常见的翻译叫享元模式,我更习惯叫他共享轻量模式。
    在iOS的UIKit框架中,UIFont, UIColor 都用到了这种模式。
    整个工程项目共享同样的对象,可以在多种模块下使用,使用的时候,直接去存储池中取,取不到再创建它。
    下面直接举一个了🌰

    import UIKit
    
    let red1 = UIColor.red
    let red2 = UIColor.red
    
    print(red1 === red2)
    
    extension UIColor {
        public static var colorStore: [String: UIColor] = [:]
        public class func rgba(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat) -> UIColor {
            let key = "\(red)\(green)\(blue)\(alpha)"
            if let color = colorStore[key] {
                return color
            }
            
            let color = UIColor(red: red, green: green, blue: blue, alpha: alpha)
            colorStore[key] = color
            return color
        }
    }
    

    UIColor直接取到的red对象在内存中只保存一份,所以red1和red2的地址相同
    对UIColor进行扩展,提供一个类方法创建UIColor对象,使用一个字典存储颜色。
    在第一次取颜色对象的时候,创建它并储存在字典中。
    如果第二次取同样颜色的时候,就直接从字典中取得这个颜色对象,并返回。

    这就是共享轻量模式的一个简单例子,如果项目中使用的共享对象比较多,可以创建一个动态缓存池,根据LRU(Least Recently Used,最近很少使用)原则进行内存优化。

    相关文章

      网友评论

        本文标题:Swift 5.2 Flyweight Pattern 共享轻量

        本文链接:https://www.haomeiwen.com/subject/kzsjcktx.html