前言
原型和建造者模式(创建型设计模式)的 C++ 代码示例模板。
代码仓库
原型模式(Prototype)
结构
- 抽象原型类
- 具体原型类
- 具体原型对象的克隆方法通过拷贝构造函数创建当前对象的副本
核心
- 继承
- 多态
- 拷贝构造函数注意浅拷贝和深拷贝问题
- 克隆方法通过拷贝构造函数创建副本
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include <iostream> #include <memory>
using std::cout; using std::endl; using std::make_unique; using std::unique_ptr;
class AbstractPrototype { public: AbstractPrototype() = default; virtual ~AbstractPrototype() = default;
virtual inline unique_ptr<AbstractPrototype> clone() const = 0;
virtual void func() = 0; };
class ConcretePrototype : public AbstractPrototype {
public: ConcretePrototype(int data) : data(make_unique<int>(data)) {} ~ConcretePrototype() override = default;
ConcretePrototype(const ConcretePrototype &other) : data(make_unique<int>(*(other.data))) { cout << "Deep copy" << endl; }
inline unique_ptr<AbstractPrototype> clone() const override { return make_unique<ConcretePrototype>(*this); }
void func() override { cout << "ConcretePrototype: " << *this->data << endl; }
private: unique_ptr<int> data; };
int main() { unique_ptr<ConcretePrototype> original = make_unique<ConcretePrototype>(10); original->func();
unique_ptr<AbstractPrototype> clone = original->clone(); clone->func();
return 0; }
|
建造者模式(Builder)
结构
- 产品类
- 抽象建造者类
- 具体建造者类
- 指挥者类
- 创建具体建造者对象(建造准备1)
- 创建具体建造者对象时,创建产品对象(建造准备2)
- 使用具体建造者对象,创建指挥者对象(建造准备3)
- 指挥者对象调用建造方法(建造过程1)
- 建造方法中,具体建造者对象调用建造产品方法(建造过程2)
- 建造产品方法中,产品对象调用相关方法(建造过程3)
- 具体建造者对象调用获取产品方法(获取结果)
- 产品对象调用展示方法(展示结果)
核心
- 继承
- 多态
- 产品,表现需要建造的内容(如建造桌子,需要建造桌面,需要建造桌腿)
- 建造者 建造 产品,实现建造过程的内容(如建造桌子,建造桌面是光滑的,建造桌腿是稳固的)
- 指挥者 指挥 建造者,控制建造过程的时序(如建造桌子,先建造桌面,后建造桌腿)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| #include <string> #include <iostream> #include <memory>
using std::cout; using std::endl; using std::make_shared; using std::shared_ptr; using std::string;
class Product { public: Product() = default; ~Product() = default;
void set_part_a(const string &part_a) { this->part_a = part_a; }
void set_part_b(const string &part_b) { this->part_b = part_b; }
inline void show() const { cout << "Product parts: " << this->part_a << ", " << this->part_b << endl; }
private: string part_a; string part_b; };
class AbstractBuilder { public: AbstractBuilder() = default; virtual ~AbstractBuilder() = default;
virtual void build_part_a() = 0; virtual void build_part_b() = 0; virtual Product get_product() = 0; };
class ConcreteBuilder : public AbstractBuilder { public: ConcreteBuilder() : product() {} ~ConcreteBuilder() override = default;
void build_part_a() override { this->product.set_part_a("Part A"); }
void build_part_b() override { this->product.set_part_b("Part B"); }
inline Product get_product() override { return this->product; }
private: Product product; };
class Director { public: Director(shared_ptr<AbstractBuilder> abstract_builder) : abstract_builder(abstract_builder){}; ~Director() = default;
void build() { abstract_builder->build_part_a(); abstract_builder->build_part_b(); }
private: shared_ptr<AbstractBuilder> abstract_builder; };
int main() { shared_ptr<AbstractBuilder> concrete_builder = make_shared<ConcreteBuilder>();
Director director(concrete_builder);
director.build();
Product product = concrete_builder->get_product();
product.show();
return 0; }
|
总结
原型模式和建造者模式(创建型设计模式)的 C++ 代码示例模板。
参考资料
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获