享元设计模式

百花池例子.

FlowerView类

class FlowerView: UIImageView {

    override func draw(_ rect: CGRect) {
        image?.draw(in: rect)
    }
}

FlowerFactory类

class FlowerFactory: NSObject {

    var flowerPool: [String: FlowerView] = [:]
    
    func flowerViewWithType(type: FlowerType) -> UIView {
        
        var flowerView = flowerPool[type.rawValue]
        if flowerView == nil {
            let flowerImage = UIImage(named: type.rawValue)
            flowerView = FlowerView(image: flowerImage)
            flowerPool[type.rawValue] = flowerView
        }
        return flowerView!
    }
}

FlyWeightView类


class FlyWeightView: UIView {

    var flowerList: Array = [ExtrinsicFlowerState]()
    override func draw(_ rect: CGRect) {
        for state in flowerList {
            state.flowerView.draw(state.area)
        }
    }
}

客户端代码

 override func viewDidLoad() {
        super.viewDidLoad()
        let factory = FlowerFactory()
        var flowerList = Array<ExtrinsicFlowerState>()
        
        for _ in 0..<500 {
            var types = [FlowerType.one, FlowerType.tow, FlowerType.three]
            let type = types[Int(arc4random() % 3)]
            let flowerView = factory.flowerViewWithType(type: type)
            let bounds = UIScreen.main.bounds
            let x = arc4random() % UInt32(bounds.width)
            let y = arc4random() % UInt32(bounds.height)

            let minSize: UInt32 = 10
            let maxSize: UInt32 = 50
            
            let size = (arc4random() % (maxSize - minSize + 1)) + minSize
            
            let extrinsicState = ExtrinsicFlowerState(flowerView: flowerView, area: CGRect(x: Int(x), y: Int(y), width: Int(size), height: Int(size)))
            flowerList.append(extrinsicState)
        }
        
        (self.view as! FlyWeightView).flowerList = flowerList
    }

结果如下:


result

GitHub地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,670评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,491评论 19 139
  • 一. 类簇设计模式 例如NSNumber类 NSNumber类创建的对象的时候通过NSPlaceholderNum...
    CarsonChen阅读 1,768评论 0 0
  • 应用程序使用很多对象在内存中保存对象会影响内存性能对象的多数特有状态可以放到外部而轻量化移除了外在状态之后,可以用...
    Crazy2015阅读 2,532评论 0 0
  • 感动只能一时 你的美丽也如这感动 在我生命中,只能一瞬 那个时候 我是不是可以牵着你的手 静静等待这一瞬的来到和离...
    阿琴姑娘阅读 3,685评论 13 35