什么是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)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点以访问该实例。单例模式通常涉及到延迟实例化(懒汉模式)或者在首次访问时创建实例,并确保在整个应用程序中只有一个实例存在。要点:私有构造函数: 单例类通常将其构造函数设置为私有,以防止外部直接实例化。私有静态实例: 单例类通常包含一个私有的静态成员变量,用于保存实例。公有静态方法: 提供一个公有的静态方法,用于获取该类的唯一实例。在这个方法中,通常会检查是否已经创建了实例,如果没有则进行实例化。应用场景全局配置:例如,日志配置、数据库连接池等。全局访问点:例如,计数器、计时器等。资源管理:例如,文件锁、打印机等。示例代码#include <iostream> #include <mutex> class ThreadSafeSingleton { public: // 获取实例的静态方法 static ThreadSafeSingleton& getInstance() { // 使用双检锁机制确保线程安全
原型模式是一种创建型设计模式,使用它可以复制已有对象,并且不需要依赖已有对象所属的类。如果需要复制一个对象,该怎么做呢?称想要复制的对象为对象A,复制得到的对象为对象B。分为两步:用A的类新建一个实例对象,这个对象就是B把A的所有属性值都赋值给B。复制结束。这两步每一步都有问题,第一步当前代码必须能够访问A所属的类,有一种场景,方法的参数是接口类型,一个类只要实现了接口,其对象就可以作为参数传递。这时方法里的代码无法访问参数的实际类型。第二步,A所属的类有些属性是私有的。从外部无法访问。解决办法:原型模式原型模式将上门的两步从A类外转移到A类内,那么上面两步的问题就不存在了。声明一个包含克隆方法的通用接口interface,让A的类实现这个接口。当需要A的克隆对象时,只需要A调用克隆方法即可。类图:代码示例:#include <iostream> #include <string> // 1. 原型接口 class Prototype { public: virtual Prototype* clone() const = 0; virtual
生成器模式是一种创建型设计模式,用于分步骤创建复杂对象,从而隐藏构建过程的细节。并且相同的创建代码可以生成不同类型和形式的对象。什么是复杂对象?在面向对象的编程中,实际体现的就是一个类的构造函数。有这么一个类,它有很多成员变量,成员变量中有简单的类型对象,也有其他用户自定义的类型对象。需要在构造函数中对这些成员变量进行初始化工作。构造函数带了很多参数,用于不同成员变量的初始化。解决的问题创建这样的对象,通常要传递很多参数,其中有很多是没用的。并且要在构造函数里做很多if判断。类图示例代码#include <iostream> #include <string> // 1. 产品 - 计算机 class Computer { public: void setMotherboard(const std::string& motherboard) { motherboard_ = motherboard; } void setCPU(const std::string& cpu) { cpu_
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。它对客户端代码隐藏了实现细节,客户端不用关心某一系列产品的具体名称。客户端只知道这一系列产品中的具体产品的共同行为。而且它也只关心共同行为。考虑全屋定制家具场景:一个家庭都需要沙发、椅子、桌子等等家具。客户偏好的风格可能是不同的,有的客户喜欢西式,有的客户喜欢中式。西式和中式的沙发、椅子、桌子是不同风格。现在要根据客户不同的偏好创建不同的沙发、椅子等。这时就适合抽象工厂模式发挥作用。如果不使用抽象工厂,会怎么做呢?如果客户喜欢中式 创建中式沙发 创建中式椅子 创建中式桌子 如果客户喜欢西式 创建西式沙发 创建西式椅子 创建西式桌子 ···使用抽象工厂如果客户喜欢中式 创建中式工厂 如果客户喜欢西式工厂 创建西式工厂 ··· 工厂创建沙发 工厂创建椅子 工厂创建桌子如果增加一种风格,客户相关的代码只需要增加客户偏好的判断即可,其他增加新的类就好。如果突然流行苏州中式风格的家具。客户端代码不用动,只需修改中式工厂代码即可。类图示例代码#include <