5.PrototypePattern - QDDCoder/LZLearniOS GitHub Wiki

原型模式

 原型模式
 
 解释地址:https://www.runoob.com/design-pattern/prototype-pattern.html
 
 原型模式Prototype Pattern是用于创建重复的对象同时又能保证性能这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式这种模式是实现了一个原型接口该接口用于创建当前对象的克隆当直接创建对象的代价比较大时则采用这种模式例如一个对象需要在一个高代价的数据库操作之后被创建我们可以缓存该对象在下一个请求时返回它的克隆在需要的时候更新数据库以此来减少数据库调用意图用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象主要解决在运行期建立和删除原型何时使用1当一个系统应该独立于它的产品创建构成和表示时2当要实例化的类是在运行时刻指定时例如通过动态装载3为了避免创建一个与产品类层次平行的工厂类层次时4当一个类的实例只能有几个不同状态组合中的一种时建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些如何解决利用已有的一个原型对象快速地生成和原型对象一样的实例优点1性能提高2逃避构造函数的约束缺点1配备克隆方法需要对类的功能进行通盘考虑这对于全新的类不是很难但对于已有的类不一定很容易特别当一个类引用不支持串行化的间接对象或者引用含有循环结构的时候2必须实现 Cloneable 接口

clone协议

protocol Cloning {
    func clone() -> AnyObject
}

创建类并实现协议

class Pet: NSObject {
    var name :String?
    var weight:Float?
    init(name:String,weight:Float) {
        super.init()
        self.name   = name
        self.weight = weight
    }
}

extension Pet:Cloning {
    func clone() -> AnyObject {
        return Pet(name: name!, weight: weight!)
    }
}

class Person: NSObject {
    var pet:Pet?
    var name:String?
    var height:Float?
    init(name:String,height:Float,pet:Pet) {
        super.init()
        self.name   = name
        self.height = height
        self.pet    = pet
    }
}

extension Person:Cloning{
    func clone() -> AnyObject {
        return Person(name: name!, height: height!, pet: pet?.clone() as! Pet)
    }
}
  • 测试

//简单拷贝
private func simapleClone()  {
    let author = Person(name: "啊哈哈", height: 173, pet: Pet(name: "球球", weight: 2.0))
    var persons:[Person] = [Person]()
    for _ in 0...9 {
        persons.append(author.clone() as! Person)
    }
    persons.forEach { (p) in
        print("--->>\(p.name)-->\(p.pet?.name)")
    }
}

//登记拷贝
func cloneManager() {
    let author = Person(name: "啊哈哈", height: 173, pet: Pet(name: "球球", weight: 2.0))
    let clone = author.clone()
    CloneManager.sharedManager.store(prototype: clone as! Cloning, for: "CloneInstance")
    
    let storeClone = CloneManager.sharedManager.prototype(for: "CloneInstance")
    
    if clone.isEqual(storeClone) {
        print("获取成功")
    }
    if !clone.isEqual(author){
        print("你创建了一个拷贝 author")
    }
}
  • 测试结果

//简单拷贝
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")
--->>Optional("啊哈哈")-->Optional("球球")


//登记拷贝
获取成功
你创建了一个拷贝 author
⚠️ **GitHub.com Fallback** ⚠️