【设计模式】13 - 原型模式 (Prototype Pattern)

这篇文章是我阅读raywenderlich.com的Design Patterns by Tutorials的总结,文中的代码是我阅读书本之后根据自己的想法修改的。如果想看原版书籍,请点击链接购买。


原型模式属于创建型模式,允许我们对一个对象进行复制。它包含两个部分:1) Copying协议;2) 遵循Copying协议的Class类型。

复制又分为两种类型:浅复制和深复制:

  • 浅复制:创建了一个新的实例,但是不复制原实例的属性,而是所有属性都指向原实例。

  • 深复制:创建新的实例,并且复制原有实例的属性。

什么时候使用

当想要复制一个对象的时候,使用这个模式。

简单demo

在Objective-C的时候,有一个NSCopying协议,虽然在Swift还是可以使用,但使用起来不是非常友好,所以这里我们就自己定义一个Copying协议:

protocol Copying: class {
    init(_ prototype: Self)
}

extension Copying {
    func copy() -> Self {
        return type(of: self).init(self)
    }
}

首先我们定义了一个Copying协议,并规定了一个把当前类型的实例作为参数初始化函数;然后通过扩展实现了copy()方法。

接下来定义一个宠物类,并实现Copying协议:

class Pet: Copying {
    let name: String
    let weight: Double

    init(name: String, weight: Double) {
        self.name = name
        self.weight = weight
    }

    // MARK: - Copying

    required convenience init(_ pet: Pet) {
        self.init(name: pet.name, weight: pet.weight)
    }
}

试试我们刚刚定义的宠物类:

let pet1 = Pet(name: "Lili", weight: 10)
let pet2 = pet1.copy()
print("pet1====name: \(pet1.name)====weight: \(pet1.weight)")
print("pet2====name: \(pet2.name)====weight: \(pet2.weight)")

// 结果
pet1====name: Lili====weight: 10.0
pet2====name: Lili====weight: 10.0

结果完全一样,这样我们就完成了对一个实例的复制。

欢迎加入我管理的Swift开发群:536353151

下一篇文章:【设计模式】14 - 状态模式 (State Pattern)

你可能感兴趣的:(【设计模式】13 - 原型模式 (Prototype Pattern))