C++创建型设计模式之 原型模式
原型模式简介
对于较复杂的类型,我们在构造一个对象时当然可以用前面讲到的构造器模式或工厂模式来作为获取的方法,但在我们已知一个对象A和另一个对象B只有很小一部分的属性不同时,我们肯定会希望给A对象拷贝一份作为B,再将B对象相应的属性设置正确就行了。比如一对双胞胚姐妹,只有名字不同,在填完姐姐信息后,复制一份后再将名字修改成妹妹的便大功告成。
根据原型模式的目的,关键的任务就是拷贝,但方法可不只有重写虚接口 clone() 一种。
直接拷贝方法
对于成员变量中不含引用,指针,智能指针等变量时,我们直接拷贝便可以。但在对象拷贝时,难点就是存在指针的情况。当然对于一级指针,指针所指的原对象中不再含有指针情况时,我们使用拷贝构造或重载等号的方法,都可以实现对象的深拷贝。
例如,我们需要对溜狗的人群作个研究,我们将狗主人设为成员变量,将狗设为指针,通过属性设置接口完成对应属性设置:
#include <iostream>
enum class Sex
{
man = 0,
woman
};
struct Dog
{
std::string name;
std::string weight;
std::string color;
};
struct Master
{
std::string name;
int age;
Sex sex = Sex::man;
};
class WalkDog
{
Master _master;
Dog* _dog = nullptr;
public:
WalkDog() = default;
void setMaster(Master master)
{
_master = master;
}
void setDog(Dog dog)
{
if (_dog) *_dog = dog;
else {
_dog = new Dog{
dog};
}
}
Master getMaster() const {
return _master; }
Dog* getDog() const {
return _dog; }
WalkDog(Master master, Dog dog)
{
_master = master;
*_dog = dog;
}
void print