网站备案 需要上传网站么,中国建设银行招聘官方网站,登录贵州省住房和城乡建设厅网站,企业年金辞职了就白交了吗动机
在软件系统中#xff0c;经常面临着某些结构复杂的对象的创建工作#xff1b;由于需求的变化#xff0c;这些对象经常面临着剧烈的变化#xff0c;但是它们却拥有比较稳定一致的接口。
之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多#…动机
在软件系统中经常面临着某些结构复杂的对象的创建工作由于需求的变化这些对象经常面临着剧烈的变化但是它们却拥有比较稳定一致的接口。
之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多但是原型模式将抽象基类合并。
原型模式的应用场景
原型模式特别适用于以下场景
对象的创建过程比较复杂或耗时。需要动态创建对象且对象的类型在运行时才能确定。需要避免重复初始化对象的开销。
#include iostream
#include memory
#include string// 抽象类
class ISplitter {
public:virtual void split() 0;virtual std::unique_ptrISplitter clone() const 0; // 返回一个智能指针virtual ~ISplitter() {}
};// 二进制拆分器
class BinarySplitter : public ISplitter {
private:std::string data; // 假设这是需要拆分的二进制数据
public:BinarySplitter(const std::string data) : data(data) {}void split() override {std::cout Splitting binary data: data std::endl;// 具体的二进制拆分逻辑}std::unique_ptrISplitter clone() const override {return std::make_uniqueBinarySplitter(*this); // 深拷贝}
};// 文本拆分器
class TxtSplitter : public ISplitter {
private:std::string data; // 假设这是需要拆分的文本数据
public:TxtSplitter(const std::string data) : data(data) {}void split() override {std::cout Splitting text data: data std::endl;// 具体的文本拆分逻辑}std::unique_ptrISplitter clone() const override {return std::make_uniqueTxtSplitter(*this); // 深拷贝}
};// 使用示例
int main() {// 创建原始对象BinarySplitter binarySplitter(01010101);TxtSplitter txtSplitter(Hello, World!);// 克隆对象std::unique_ptrISplitter binaryClone binarySplitter.clone();std::unique_ptrISplitter txtClone txtSplitter.clone();// 使用克隆对象binaryClone-split();txtClone-split();return 0;
}模式定义
使用原型实例指定创建对象的种类然后通过拷贝这些原型来创建新的对象。
什么时候使用原型什么时候使用工厂最大的区分点就在于用工厂方法创建对象是不是非常简单的几个步骤就可以把这个对象创建出来还是说需要考虑对象很复杂的中间状态然后又很希望保留这个中间状态如果是后者的话就用原型。
要点总结
Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系它同样要求这些“易变类”拥有稳定的接口。
Prototype模式对于“如何创建易变类”的实体对象“采用”原型克隆的方法来做它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象–所需工作仅仅是注册一个新类的对象(即原型)然后在任何需要的地方Clone。
Prototype模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝。