享元模式
英文名称:Flyweight
使用享元对象,可以有效支持大量的细粒度对象
强调:对象的共享
应用场景
场景一:系统存在大量的相似对象
场景二:需要缓冲池场景
享元模式角色划分:
角色一:享元对象接口(协议)->抽象
角色二:具体享元对象
角色三:享元工厂(负责创建对象、管理对象)
4、原理案例
角色一:享元对象接口(协议)->抽象
//第一步:享元接口->TicketProtocol
protocol TicketProtocol {
//高铁票:二等座、一等座、特等座、商务座
func showTicketInfo(bunk:String)
}
角色二:具体享元对象
//火车票(成都->北京)
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)")
}
}
角色三:享元工厂(简单工厂模式)
//负责创建对象、管理对象
class TicketFactory: NSObject {
class func ticket(from:String, to:String) -> TicketProtocol {
//问题在于如果我要查询相同的路线,重写创建对象
//相同路线应该查询一次就可以了,这样做的目的能够提供效率
//过年买火车票,查询北京->成都,12306,100万用户查询北京->成都->服务器内存缓存,对象也是一个
//相同路线进行缓存->享元模式解决(对象池)
return TrainTicket(from: from, to: to)
}
}
外部调用:
let ticket = TicketFactory.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)
其实享元模式,我理解就是简单工厂模式的使用,不过其中某个对象的创建可能不是每次都会创建,而是会被使用字典或者别的某个容器保存并且记录下来,下次再使用就不会再创建。
网友评论