【C++】设计模式:建造者、原型、单例
😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍设计模式:建造者、原型、单例。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞
文章目录
- :smirk:1. 建造者模式
- :blush:2. 原型模式
- :satisfied:3. 单例模式
😏1. 建造者模式
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式的结构包含以下几个角色:
- 抽象建造者(AbstractBuilder):创建一个Product对象的各个部件指定的抽象接口;
- 具体建造者(ConcreteBuilder):实现AbstractBuilder的接口,实现各个部件的具体构造方法和装配方法,并返回创建结果。
- 产品(Product):具体的产品对象
- 指挥者(Director): 构建一个使用Builder接口的对象,安排复杂对象的构建过程,客户端一般只需要与Director交互,指定建造者类型,然后通过构造函数或者setter方法将具体建造者对象传入Director。它主要作用是:隔离客户与对象的生产过程,并负责控制产品对象的生产过程
#include #include // 产品类 class Product { public: void setPartA(const std::string& partA) { partA_ = partA; } void setPartB(const std::string& partB) { partB_ = partB; } void setPartC(const std::string& partC) { partC_ = partC; } void show() { std::cout public: virtual void buildPartA() = 0; virtual void buildPartB() = 0; virtual void buildPartC() = 0; virtual Product* getProduct() = 0; }; // 具体建造者类 A class ConcreteBuilderA : public Builder { public: void buildPartA() override { product_-setPartA("PartA of Product A"); } void buildPartB() override { product_-setPartB("PartB of Product A"); } void buildPartC() override { product_-setPartC("PartC of Product A"); } Product* getProduct() override { return product_; } private: Product* product_ = new Product(); }; // 指挥者类 class Director { public: void construct(Builder* builder) { builder-buildPartA(); builder-buildPartB(); builder-buildPartC(); } }; int main() { Director director; ConcreteBuilderA builderA; director.construct(&builderA); Product* productA = builderA.getProduct(); productA-show(); delete productA; return 0; }
适用环境:
- 需要生成的产品对象有复杂的内部结构(通常包含多个成员变量);
- 产品对象内部属性有一定的生成顺序;
- 同一个创建流程适用于多种不同的产品。
😊2. 原型模式
原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
原型式的结构包含以下几个角色:
- 抽象原型类(AbstractPrototype):声明克隆clone自身的接口
- 具体原型类(ConcretePrototype):实现clone接口
- 客户端(Client):客户端中声明一个抽象原型类,根据客户需求clone具体原型类对象实例
原型模式可以说是“复制”,即克隆,但这个复制不是代码的复制,而是将对象包含的所有属性都创建一份拷贝。但不同的复制操作,可能会产生两种不同的拷贝,即浅拷贝和深拷贝。
#include // 原型基类 class Prototype { public: virtual Prototype* clone() = 0; virtual void show() = 0; }; // 具体原型类 A class ConcretePrototypeA : public Prototype { public: Prototype* clone() override { return new ConcretePrototypeA(*this); } void show() override { std::cout public: Prototype* clone() override { return new ConcretePrototypeB(*this); } void show() override { std::cout ConcretePrototypeA prototypeA; Prototype* clonedA = prototypeA.clone(); clonedA-show(); delete clonedA; ConcretePrototypeB prototypeB; Prototype* clonedB = prototypeB.clone(); clonedB-show(); delete clonedB; return 0; } public: // 获取单实例 static Singleton* GetInstance(); // 释放单实例,进程退出时调用 static void deleteInstance(); // 打印实例地址 void Print(); private: // 将其构造和析构成为私有的, 禁止外部构造和析构 Singleton(); ~Singleton(); // 将其拷贝构造和赋值构造成为私有函数, 禁止外部拷贝和赋值 Singleton(const Singleton &signal); const Singleton &operator=(const Singleton &signal); private: // 唯一单实例对象指针 static Singleton *g_pSingleton; }; return g_pSingleton; } void Singleton::deleteInstance() { if (g_pSingleton) { delete g_pSingleton; g_pSingleton = nullptr; } } void Singleton::Print() { std::cout std::cout std::cout public: static std::shared_ptr std::cout std::cout std::cout std::call_once(singletonFlag, [&] { singleton = std::shared_ptr
The End