• 创建型模式-原型模式


    系列文章目录

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



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

    解决问题

    如果你有一个对象, 并希望生成与其完全相同的一个复制品,首先,你需要创建一个同类对象,然后遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。但有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的。其次,对于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
  • 相关阅读:
    Android 系统启动 <init 进程> 笔记【1】
    使用DeepSpeed/P-Tuning v2对ChatGLM-6B进行微调
    LocalDateTime用法
    Google Earth Engine(GEE)扩展——制作的GEE app的误区
    js 关键字赋值.html
    基于Matlab实现图像分割技术(附上源码+图像)
    GBase 8c V3.0.0数据类型——HLL函数和操作符(日志函数)
    280 基于matlab的摇号系统GUI界面仿真MATLAB程序
    ubuntu server 安装Gnome桌面并设置开机boot到桌面
    软件设计师——信息安全知识
  • 原文地址:https://blog.csdn.net/u011303816/article/details/125895779