简介
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式和拷贝构造的区别
原型模式类是未知的,拷贝构造类是已知的:意思是原型函数可以使用多态,所以类是未知的,也可能创建的是子类的对象;而拷贝构造就是他自己了。
所以拷贝构造就是原型模式的一个子集
而且还有个要注意的是,完全拷贝一个对象,肯定要用深拷贝
使用场景
基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式。
优点
.使用原型模式比直接new一个对象的开销要小的多。
因为new一个对象可能需要一些复杂的逻辑,导致开销比较大,而原型模式只需要进行拷贝就行了开销相对要小的多了。
代码如下(c++11):
#include <iostream>
#include <string>
#include <string.h>
#include <memory>
class prototype_base
{
public:
prototype_base(void){}
virtual ~prototype_base(void){}
virtual void print_reslut(void) = 0;
virtual std::shared_ptr<prototype_base> clone(void) = 0;
};
class concrete_prototype : public prototype_base
{
public:
concrete_prototype(const char *name)
{
if(name)
{
init_name(name);
}
else
{
init_name("concrete_prototype");
}
}
~concrete_prototype(void)
{
clear();
}
concrete_prototype(const concrete_prototype& cp)
{
if(cp.m_name==nullptr || cp.m_len == 0)
{
init_name("concrete_prototype");
}
else
{
init_name(cp.m_name);
}
}
std::shared_ptr<prototype_base> clone(void)
{
return std::make_shared<concrete_prototype>(*this);
//return new concrete_prototype(*this);
}
void print_reslut(void)
{
std::cout << "my prototype name is : " << m_name << std::endl;
}
void init_name(const char *name)
{
clear();
m_len = strlen(name) + 1;
m_name = (char *)malloc(m_len);
snprintf(m_name, m_len, "%s", name);
}
void clear(void)
{
if(m_name)
{
free(m_name);
m_name = nullptr;
m_len = 0;
}
}
char *m_name;
int m_len;
};
int main()
{
std::cout << "start-up .." << std::endl;
std::shared_ptr<prototype_base> proa = std::make_shared<concrete_prototype>("删库解bug");
proa->print_reslut();
std::shared_ptr<prototype_base> prob = proa->clone();
prob->print_reslut();
std::cout << "done .." << std::endl;
return 0;
}
运行结果: