关于单例模式
1.什么是单例模式?
答:
单例模式是一种创建型设计模式,确保一个类在运行期间仅有一个实例,提供全局唯一的访问点
2.单例模式的目的?
答:
避免重复创建资源消耗大的对象,例如日志系统、线程池、连接池等
统一管理全局共享状态或资源、例如配置管理器
确保实例在程序结束时正确销毁,避免资源泄露
总结:避免重复创建资源大的对象、统一管理一些资源、确保销毁
3.在日志系统中,为什么用到了单例模式?全局变量不行吗?
答:
在这个日志系统中,支持多个日志器存在,你可以创建建造者类的接口创建多个日志器,每个日志器可以设置自己的输出方向和日志格式,通过单例模式建造一个日志器管理类,每当创建一个日志器后都会放入这一个全局单例类中进行管理,可以通过单例类中的接口根据日志器名称来获取你想要的日志器,然后进行输出打印,通过单例模式减少了频繁创建的问题,任何模块都可以通过这个全局管理类来获取日志器
总结:为了让日志器管理类全局只有一个,每个日志器创建出来后都会放入这个类中,全局都可以通过getinstance接口来访问,全局变量很难保证其他代码不会修改到它
4.用的懒汉模式还是饿汉模式?他俩的区别是什么?
答:
饿汉模式:在main函数执行前初始化、没有线程安全问题、但是可能造成资源浪费
懒汉模式:在第一次使用的时候初始化、有线程安全问题、资源浪费情况小
5.单例模式为什么要禁用拷贝构造和赋值,如果不禁用会有什么风险
答:
防止通过拷贝和赋值创建新对象、破坏单例唯一性
如果不禁用,用户可以通过A a = A::getinstance(); 创建副本
6.单例模式的生命周期和析构问题?
答:
饿汉模式:按照全局/静态变量析构
懒汉模式:按照局部静态变量析构
7.单例模式的优缺点与使用场景?
答:
优点:资源利用率高,减少重复创建和销毁的开销
缺点:懒汉模式线程安全
8.三种懒汉模式(非安全、安全、c++11)的性能对比?
答:
非安全:性能最快,无锁开销
安全:第一次初始化加锁,其他时候不加锁,性能还行
c++11:性能也还行、
9.c++11版本的原理?
答:
编译器在生产代码时,会为局部变量添加一个辅助标志位判断是否被初始化
执行到代码的时候判断标志位,没有被初始化就加锁,已初始化就跳过,返回
关于工厂模式
10.日志系统中为什么用到了工厂模式,谈谈对工厂模式的理解?
答:
在日志落地模块通过工厂模式来生产指定落地方式,通过工厂模式来进行扩展新落地方式
工厂模式是一种创建型设计模式、通过定义工厂类的接口,在接口内部返回指定的对象
解决了创建和使用耦合的问题,一旦对象的创建方式发生变化,仅需更改工厂模式
使扩展更方便
隐藏了创建的复杂逻辑细节,只返回对象
注意项:工厂模式返回对象尽量智能指针,不然使用完对象需要手动delete,不然内存泄漏
11.工厂模式跟建造者模式的关系?
答:
两者都是创建型设计模式、都封装了对象的创建过程
工厂模式专注于创建不同类型的产品,我要什么 工厂给我什么
建造者模式专注于如何一步步构建产品
12.工厂模式的分类及核心区别?
答:
简单工厂模式:一个工厂类、新增产品需修改工厂
工厂方法模式:抽象一个工厂类,一个产品一个子工厂类
抽象工厂模式:抽象一个工厂类,一个产品类一个子工厂类
关于建造者模式
1.日志系统为什么使用建造者模式?谈谈你对建造者模式的理解
答:
在日志系统中的构建完整日志器、如日志器名称、日志消息、等级、日志格式化器、同步/异步、落地方式 是通过建造者模式的,因为日志系统是两种日志器:局部和全局,设置两个建造者类来进行建造,我们只需要传入对应参数,帮我们建造完返回给我们对象
建造者模式也是一种创建型设计模式,将复杂对象的构造过程统一
2.建造者模式的优缺点
答:
优点:解耦构造过程与产品表示,便于扩展(新增具体建造者类就可生成新对象)
精确控制对象的构建步骤,代码可读性高
缺点:增加了类的数量、如果产品结构更改 需要修改