• 创建型模式-原型模式


    系列文章目录

    设计模式概述
    创建型模式-单例模式
    创建型模式-原型模式
    创建型模式-建造者模式



    原型模式是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类。

    解决问题

    如果你有一个对象, 并希望生成与其完全相同的一个复制品,首先,你需要创建一个同类对象,然后遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。但有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的。其次,对于java及一些其他语言而已,有时候,对象的持有者,并不知道该对象所属的类,也不方便依赖该类,它只是知道对象所实现的接口,这个时候,你就需要原型模式。

    应用场景

    • 如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类时。
    • 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时。
    • 类初始化需要消耗非常多的资源,或者需要非常繁琐的数据准备或访问权限时。

    实现

    在这里插入图片描述

    @interface Person : NSObject 
    @property (nonatomic, copy) NSString *name;
    @end
    
    @implementation Person
    - (id)copyWithZone:(NSZone *)zone {
        Person *person = [[[self class] alloc] init]; // 没有调用[super copyWithZone:zone]
        person.name = [self.name copy];
        return person;
    }
    
    @end
    
    @interface Student : Person 
    @property (nonatomic, assign) NSUInteger studentNumber;
    @end
    
    @implementation Student
    - (id)copyWithZone:(NSZone *)zone {
        Student *student = [super copyWithZone:zone]; // 调用[super copyWithZone:zone]
        student.studentNumber = self.studentNumber;
        return student;
    }
    @end
    
    
    @interface School : NSObject
    @end
    
    @implementation PrototypeSubClass
    - (void)copyAStudent {
        Student *studentA = [Student alloc] init];
        Student *studentB = [studentA copy];
        studentB.studentNumber = studentA.studentNumber++;
    }
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    优缺点

    ✅ 你可以克隆对象, 而无需与它们所属的具体类相耦合。
    ✅ 可以更方便地生成复杂对象。
    ✅ 可以克隆预生成原型, 避免反复运行初始化代码。

    ❌ 克隆包含循环引用的复杂对象可能会非常麻烦。

    总结

    由谁创建(Who) :由原型对象创建
    创建什么(What) :原型对象的拷贝
    何时创建(When):客户端需要一个新的原型对象时

    实践讨论

    端侧开发,一般不需要做大数据量的处理工作,即使有相似的同个类对象批量出现的场景,譬如 UITableView(列表控件),也是使用复用而不是拷贝产生新对象,为什么?


    参考资料

    1. 《设计模式的艺术》作者:刘伟
    2. 网站:https://refactoringguru.cn/design-patterns
  • 相关阅读:
    从一坨代码说起
    【RTOS学习】优先级 | Tick | 任务状态 | 空闲任务 | 任务调度
    react18-webchat网页聊天实例|React Hooks+Arco Design仿微信桌面端
    智能电表的功率计算方式是一样的吗?
    微信小程序开发---事件的绑定
    现在的程序员真是越来越懒了,api 文档都懒得写!程序员:“api工具惯的”
    C++ - 右值引用 和 移动拷贝
    vue自定义指令
    SAP UI5 sap.ui.base.ManagedObject 的构造函数参数讲解
    一起Talk Android吧(第三百八十八回:lifecycle)
  • 原文地址:https://blog.csdn.net/u011303816/article/details/125895779