- 原型模式
- 介绍
- 意图和动机
- 参与者
- UML图
- 模式解析
- 适用性
- 效果
- 代码示例
原型模式的意图在于用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另外一个可以定制的对象,并且不需要知道任何创建的细节。
参与者- Prototype:声明一个克隆自身的接口
- ConcreteProtorype:实现一个克隆自身的操作
- Client:让一个原型克隆自身
当下列情况可以使用原型模式:
- 当一个系统应该独立于它的产品创建、构成和表示时
- 当要实例化的类实在运行时指定时
- 为了避免创建一个与产品类层次平行的工厂类层次时
- 当一个类的实例只能由几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一下
下面时原型模式的一些优点:
- 可以在运行时增加和删除产品
- 可以改变值以指定新对象
- 改变结构以指定新对象
- 减少子类的构造
- 用类动态配置应用
以复制简历为例,其中IResume是接口类,声明了简历类的接口,包括show和clone。原型模式在C++的应用中主要涉及的是类的拷贝构造函数和clone函数
#include#include #include #include using namespace std; class IResume { public: virtual IResume* clone() const = 0; virtual void show() {}; protected: char* name; uint8_t age = 0; uint8_t sex = 0; }; class Resume : public IResume { public: // 构造函数 Resume() { name = const_cast ("No name"); } Resume(const char* str, uint8_t age, uint8_t sex) :age(age), sex(sex) { if (str == nullptr) { name = const_cast ("No name"); } else { name = new char[strlen(str) + 1]; strcpy_s(this->name, strlen(str)+1, str); } } // 拷贝构造函数,因为不应该拥有拷贝的对象的操作权,所以这里要用const Resume(const Resume& re) { int str_len = strlen(re.name); name = new char[str_len + 1]; strcpy_s(name, str_len+1, re.name); //选用深拷贝 age = re.age; sex = re.sex; } Resume* clone() const { return new Resume(*this); } void show() { cout << setfill('=') << setw(20); cout << "简历打印"; cout << setfill('=') << setw(16) << " " << endl; cout << "名字" << name << setw(10) << setfill(' ') << "年龄" << to_string(age) < // Resume* p_resume = new Resume("guyue", 24, 0); p_resume->show(); Resume* p1_resume = p_resume->clone(); p1_resume->show(); }