美文网首页工作生活
设计模式 -- 原型模式

设计模式 -- 原型模式

作者: 皆为序幕_ | 来源:发表于2019-07-06 19:21 被阅读0次

    表述 (创建型模式)

    用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象

    这里的复制指深复制 关于深浅复制传送门
    深复制就是开辟新内存实现真正的内存复制
    浅复制, 只复制指针, 堆内存不变.

    原型模式类图

    原型模式类图
    • Prototype(原型类):声明一个拷贝自身的接口
    • ConcretePrototype1和ConcretePrototype2:为Prototype的子类,实现自身的clone方法

    优点

    简化对象的创建,把创建的过程封闭到对象的内部

    使用场景

    • 需要创建的对象应独立于其类型与创建方式(想要的对象并不能够直接通过初始化函数来创建出来,其创建过程不具有普遍性且复杂)
    • 要实例化类是在运行时决定的(在编写代码的时候并不知道哪种对象会被创建出来,其内部的结构如何复杂
    • 不想要与产品层次相对应的工厂层次(不通过工厂方法或者抽象工厂来控制产品的创建过程,想要直接复制对象)
    • 有很多的相关的类,其行为略有不同,而且主要差异在于内部属性,如名称等
    • 类不容易创建,比如每个组件可把其他组件作为子节点的组合对象。复制已有的组合对象并对副本进行修改会更加容易。如果内部结构复杂,不容易重现

    示例

    需求:要求有个人信息类,必须有姓名和年龄,最终需要三份个人信息

    class Info {
       
        var name : String
        var age : Int
        
        init(name:String,age:Int) {
            self.name = name
            self.age = age
        }
        
        func show() {
            print("name:\(name),age:\(age)")
        }
    }
    
    let info0 = Info.init(name: "小白",age: 18)
    info0.show()  //name:小白,age:18
    let info1 = Info.init(name: "小白",age: 18)
    info1.show()  //name:小白,age:18
    let info2 = Info.init(name: "小白",age: 18)
    info2.show()  //name:小白,age:18
    

    可以看到三份信息需要实例化三次,如果是要n份,就需要实例化n次,这显然不是希望的样子

    iOS中,采纳NSCopying协议,通过这个协议来实现对象的深拷贝

    class Info : NSCopying {
       
        var name : String
        var age : Int
        
        init(name:String,age:Int) {
            self.name = name
            self.age = age
        }
        
        func show() {
            print("name:\(name),age:\(age)")
        }
    
        func copy(with zone: NSZone? = nil) -> Any {
            return Info (name: name, age: age)
        }
    }
    
    let info0 = Info.init(name: "小白",age: 18)
    info0.show()  //name:小白,age:18
    
    let info1 = info0.copy() as! Info
    info1.show()  //name:小白,age:18
    
    let info2 = info0.copy() as! Info
    info2.show()  //name:小白,age:18
    

    相关文章

      网友评论

        本文标题:设计模式 -- 原型模式

        本文链接:https://www.haomeiwen.com/subject/oewkhctx.html