ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

设计模式/

设计模式/ 设计模式帮助开发者用更优雅、可复用的方式解决常见问题提高代码的可读性、可维护性和可扩展性。熟练掌握这些模式是面向对象设计进阶的重要一步。设计模式分类创建型、结构性、行为型创建型单例、工厂方法、抽象工厂、建造者...结构性适配器、桥接、组合、装饰、外观...行为型模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式单例设计模式一个类全局永远只有一个实例并且提供一个全局访问点。使用场景配置类、日志工具类、数据库连接、线程池、缓存对象核心特点构造方法私有禁止外部 new提供静态方法获取唯一实例全局唯一不重复创建设计过程1.私有化构造函数2.删除拷贝构造与赋值重载3.公开静态成员函数4.当前类对象 定义在私有或者 静态成员函数内定义静态的类对象饿汉式程序启动就创建好实例天生线程安全。优点线程安全、简单缺点不用也会创建浪费一点资源懒汉式最经典但线程不安全。第一次使用才创建。多线程下会创建多个实例不安全双重检查锁DCL线程安全线程安全 懒加载。优点线程安全、懒加载、性能高为什么要两次检查第一次检查不加锁实例已经创建 → 直接返回不用加锁速度极快实例未创建 → 才进入加锁逻辑加锁保证同一时间只有一个线程能创建实例第二次检查加锁后防止多个线程同时卡在第一次检查确保只创建一次实例面试题为什么单例要私有构造防止外部new破坏单例。饿汉式 vs 懒汉式区别饿汉类加载就创建线程安全懒汉用到才创建节省资源。双重检查为什么要加 volatile防止new Singleton()指令重排导致空指针。如何防止反射破坏单例用枚举单例最安全。工厂模式简单工厂、工厂方法、抽象工厂简单工厂模式(Simple Factory Pattern)是一种创建型设计模式它通过一个工厂类来负责创建所有产品对象客户端只需要告:诉工厂需要什么产品工厂就会返回相应的产品实例。简单工厂依据用户需求创建特定的产品创建过程1.设计产品的基类2.设计具体的产品3.设计简单工厂类4.根据需求创建产品核心特点1.只有一个工厂类2.根据传入的参数决定创建哪种产品3.将对象的创建和使用分离#include memory class Phone {//接口类 public: virtual void tell(string phone) 0; }; class MiPhone :public Phone { public: void tell(string phone)override { cout MiPhone tell: phone endl; } }; class HuaWeiPhone :public Phone { public: void tell(string phone)override { cout HuaWeiPlone tell: phone endl; } }; class VivoPhone :public Phone { public: void tell(string phone)override { cout VivoPlone tell: phone endl; } }; class PhoneFactory { public: enum Type{Mi,HuaWei,Vivo}; static unique_ptrPhone create(Type type) { switch (type) { case Mi:return unique_ptrPhone(new MiPhone()); case HuaWei:return unique_ptrPhone(new HuaWeiPhone()); case Vivo:return unique_ptrPhone(new VivoPhone()); } return nullptr; } }; int main() { unique_ptrPhonephone PhoneFactory::create(PhoneFactory::Vivo); phone-tell(110); unique_ptrPhonephone2 PhoneFactory::create(PhoneFactory::HuaWei); phone-tell(120); return 0; }工厂方法工厂方法模式 (Factory Method Pattern)是一种创建型设计模式它定义了用于创建对象的接口但让子类决定实例化哪一个类。工厂方法将对象的实例化延迟到子类中完成。解决简单工厂创建产品的局限性设计核心思想将工厂创建产品抽象为一个接口具体创建某一种产品由工厂的派生类来完成。创建过程1.定义工厂的接口类2.定义生产具体产品的工厂派生类//工厂方法 class PhoneFactory { public: //工厂的创建产品的函数方法 virtual shared_ptrPhonecreate() 0; }; class HuaWeiFactory :public PhoneFactory { public: shared_ptrPhonecreate()override { return shared_ptrPhone(new HuaWeiPhone()); } }; class MiFactory :public PhoneFactory { public: shared_ptrPhonecreate()override { return shared_ptrPhone(new MiPhone()); } }; class VivoFactory :public PhoneFactory { public: shared_ptrPhonecreate()override { return shared_ptrPhone(new VivoPhone()); } }; int main() { shared_ptrPhonehwPhone HuaWeiFactory().create(); hwPhone-tell(119); return 0; }核心特点1.每个具体的产品对应一个具体的工厂2.解决了简单工厂违反开闭原则的问题3.符合“单一职责”和“开闭原则”开闭原则:添加新产品只需添加新工厂类无需修改现有代码。单一职责:每个工厂只负责创建一种产品抽象工厂抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式它提供了一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。基于工厂方法设计的在工厂基类中提供对产品的一些操作。简单理解抽象工厂将创建和使用组合到一起。核心特点1.创建产品族2.一个工厂可以创建多种产品3.强调产品之间的约束和关系观察者模式观察者模式是一种行为型设计模式用于定义对象间的一对多依赖关系当一个对象状态改变时所有依赖它的对象都会自动收到通知并更新。一个主题subject被多个观察者observer监听依赖当主题的数据成员变量发生变量时通知所有的观察者。核心角色Subject被观察者/主题管理观察者列表状态变了通知所有人Observer观察者有一个更新接口被主题调用ConcreteSubject:具体主题存状态状态变了触发通知ConcreteObserver:具体观察者收到通知做自己的事Subject维护观察者列表提供 attach / detach / notifyObserver定义 update 接口ConcreteSubject就是 Subject 结构体 state set_stateConcreteObserver就是 ConcreteObserver 自己的 update 实现
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进