享元模式定义
英文名称:flyweight
使用共享对象可以有效的支持大量的细粒度对象
强调:对象共享
享元模式应用场景
场景一:系统存在大量的相似对象
场景二:需要缓存池场景
享元模式角色划分
角色一:享元对象接口(协议)
角色二:具体享元对象
角色三:享元工厂(负责创建对象、管理对象)核心
享元模式应用场景
只要是有缓存的地方都是我们的应用场景
享元模式原理案例
例如:买火车票
角色一:享元对象接口(协议)
//
// TicketProtocol.swift
// Dream_20180718_Flyweight
//
// Created by Dream on 2018/7/18.
// Copyright © 2018年 Tz. All rights reserved.
//
import Foundation
//第一步:享元接口->TicketProtocol
protocol TicketProtocol {
//高铁票:二等座、一等座、特等座、商务座
func showTicketInfo(bunk:String)
}
角色二:具体享元对象
//
// TrainTicket.swift
// Dream_20180718_Flyweight
//
// Created by Dream on 2018/7/18.
// Copyright © 2018年 Tz. All rights reserved.
//
import Foundation
//第二步:具体享元对象->汽车票、火车票、高铁票、飞机票
//火车票(成都->北京)
class TrainTicket: TicketProtocol {
private var price:Int?
private var from:String?
private var to:String?
private var bunk:String?
init(from:String, to:String) {
self.from = from
self.to = to
}
func showTicketInfo(bunk: String) {
self.bunk = bunk
//这个逻辑需要查询数据库,根据起点位置和终点位置查询
//写死了
if bunk == "二等座" {
self.price = 880
} else if bunk == "一等座" {
self.price = 1200
} else if bunk == "特等座" {
self.price = 1500
} else if bunk == "商务座" {
self.price = 1800
}
print("起点:\(self.from)-终点:\(self.to),座位:\(self.bunk),价格:\(self.price)")
}
}
角色三:享元工厂(负责创建对象、管理对象)核心
创建新的对象,但不创建重复的对象
//
// TicketFactory2.swift
// Dream_20180718_Flyweight
//
// Created by Dream on 2018/7/18.
// Copyright © 2018年 Tz. All rights reserved.
//
import UIKit
//享元模式->key->value
class TicketFactory2: NSObject {
//字典(享元模式实现->缓存对象)
//在开发中用的很多
//场景:后面学习->图片缓存(内存缓存)
//图片url(图片名称)->key
//图片资源(缩略图)->value
//缓存策略
//第一种:内存缓存
//第二种:磁盘缓存
//第三种:双缓存(内存 + 磁盘)
static var ticketDic = [String:TicketProtocol]()
class func ticket(from:String, to:String) -> TicketProtocol {
//判断对象是否重复
let key = from + "-" + to
if ticketDic[key] == nil {
ticketDic[key] = TrainTicket(from: from, to: to)
}
return ticketDic[key]!
}
//对象要释放的时候用析构函数,或者数据定时更新(定时更新缓存)
deinit {
}
}
调用
//
// ViewController.swift
// Dream_20180718_Flyweight
//
// Created by Dream on 2018/7/18.
// Copyright © 2018年 Tz. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//测试
let ticket = TicketFactory2.ticket(from: "北京", to: "成都")
ticket.showTicketInfo(bunk: "商务座")
let view = UIView(frame: self.view.frame)
view.addSubview(UIView(frame: self.view.frame))
let image = UIImageView(frame: self.view.frame)
view.addSubview(image)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
普通代码
//
// TicketFactory.swift
// Dream_20180718_Flyweight
//
// Created by Dream on 2018/7/18.
// Copyright © 2018年 Tz. All rights reserved.
//
import UIKit
//第三步:享元工厂(简单工厂模式)
//负责创建对象、管理对象
class TicketFactory: NSObject {
class func ticket(from:String, to:String) -> TicketProtocol {
//问题在于如果我要查询相同的路线,重写创建对象
//相同路线应该查询一次就可以了,这样做的目的能够提供效率
//过年买火车票,查询北京->成都,12306,100万用户查询北京->成都->服务器内存缓存,对象也是一个
//相同路线进行缓存->享元模式解决(对象池)
return TrainTicket(from: from, to: to)
}
}
网友评论