什么是Passkeys? Passkeys是苹果提供的一种账户密码验证方式的替代品,它创建账户和登录账户无需用户输入密码。它只需要验证用户的TouchId或者FaceId。 预置条件 用户设备iOS 16.0+ 、iPadOS 16.0+ 、Mac Catalyst 16.0+ 用户设备启用iCloud钥匙串。 开发者Xcode 14.0+ 开发者在服务器根目录放置文件apple-app-site-association。放置后,用户可以通过https:///.well-known/apple-app-site-association 直接访问下载。比如域名是lcslearn.top,通过访问https://lcslearn.top/.well-known/apple-app-site-association可以直接下载。资料参考https://developer.apple.com/documentation/xcode/supporting-associated-domains#Add-the-associated-domain-file-to-your-website 原理

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点以访问该实例。单例模式通常涉及到延迟实例化(懒汉模式)或者在首次访问时创建实例,并确保在整个应用程序中只有一个实例存在。 要点: 私有构造函数: 单例类通常将其构造函数设置为私有,以防止外部直接实例化。 私有静态实例: 单例类通常包含一个私有的静态成员变量,用于保存实例。 公有静态方法: 提供一个公有的静态方法,用于获取该类的唯一实例。在这个方法中,通常会检查是否已经创建了实例,如果没有则进行实例化。 应用场景 全局配置:例如,日志配置、数据库连接池等。 全局访问点:例如,计数器、计时器等。 资源管理:例如,文件锁、打印机等。 示例代码 ```c++ include include class ThreadSafeSingleton { public: // 获取实例的静态方法 static ThreadSafeSingleton& getInstance() { // 使用双检锁机制确保线程安全 if (!instance) { std::lock_g

原型模式是一种创建型设计模式,使用它可以复制已有对象,并且不需要依赖已有对象所属的类。 如果需要复制一个对象,该怎么做呢? 称想要复制的对象为对象A,复制得到的对象为对象B。分为两步: 用A的类新建一个实例对象,这个对象就是B 把A的所有属性值都赋值给B。复制结束。 这两步每一步都有问题,第一步当前代码必须能够访问A所属的类,有一种场景,方法的参数是接口类型,一个类只要实现了接口,其对象就可以作为参数传递。这时方法里的代码无法访问参数的实际类型。 第二步,A所属的类有些属性是私有的。从外部无法访问。 解决办法:原型模式 原型模式将上门的两步从A类外转移到A类内,那么上面两步的问题就不存在了。声明一个包含克隆方法的通用接口interface,让A的类实现这个接口。当需要A的克隆对象时,只需要A调用克隆方法即可。 类图: ![2024-01-10T09:20:35.png][1] 代码示例: ```c++ include include // 1. 原型接口 class Prototype { public: virtual Prototype* clone() const = 0

生成器模式是一种创建型设计模式,用于分步骤创建复杂对象,从而隐藏构建过程的细节。并且相同的创建代码可以生成不同类型和形式的对象。 什么是复杂对象? 在面向对象的编程中,实际体现的就是一个类的构造函数。有这么一个类,它有很多成员变量,成员变量中有简单的类型对象,也有其他用户自定义的类型对象。需要在构造函数中对这些成员变量进行初始化工作。构造函数带了很多参数,用于不同成员变量的初始化。 解决的问题 创建这样的对象,通常要传递很多参数,其中有很多是没用的。并且要在构造函数里做很多if判断。 类图 ![2024-01-08T23:45:55.png][1] 示例代码 ```c++ include include // 1. 产品 - 计算机 class Computer { public: void setMotherboard(const std::string& motherboard) { motherboard_ = motherboard; } void setCPU(const std::string& cpu) { cpu_ = cpu; } voi

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。它对客户端代码隐藏了实现细节,客户端不用关心某一系列产品的具体名称。客户端只知道这一系列产品中的具体产品的共同行为。而且它也只关心共同行为。 考虑全屋定制家具场景:一个家庭都需要沙发、椅子、桌子等等家具。客户偏好的风格可能是不同的,有的客户喜欢西式,有的客户喜欢中式。西式和中式的沙发、椅子、桌子是不同风格。现在要根据客户不同的偏好创建不同的沙发、椅子等。这时就适合抽象工厂模式发挥作用。 如果不使用抽象工厂,会怎么做呢? ```伪代码 如果客户喜欢中式 创建中式沙发 创建中式椅子 创建中式桌子 如果客户喜欢西式 创建西式沙发 创建西式椅子 创建西式桌子 ··· #### 使用抽象工厂 ```伪代码 如果客户喜欢中式 创建中式工厂 如果客户喜欢西式工厂 创建西式工厂 ··· 工厂创建沙发 工厂创建椅子 工厂创建桌子 如果增加一种风格,客户相关的代码只需要增加客户偏好的判断即可,其他增加新的类就好。如果突然流行苏州中式风格的家具。客户端代码不用动,只需修改中式工厂代码即可。 类图 ![2024-0