提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
软件系统中,经常面临着某些结构复杂的对象的创建工作,由于需求变化,这些对象经常会非常剧烈的变化,但是他们却拥有比较稳定一致的接口。
此时,工厂模式已经不适用了,因为Pipeline也会变化,因为工厂基类的虚接口也会变化,甚至很难提取出来工厂基类。
提示:以下是本篇文章正文内容,下面案例可供参考
一、原始代码
// 抽象类
class ISplitter
{
public:
virtual void split() = 0;
virtual ~ISplitter() {}
};
// 工厂基类
class SplitterFactory
{
public:
virtual ISplitter *createSplitter() = 0;
virtual ~SplitterFactory() {}
};
// 具体Implement类
class BinarySplitter : public ISplitter
{
};
class TxtSplitter : public ISplitter
{
};
class VideoSplitter : public ISplitter
{
};
// 对应的工厂类
class BinarySplitterFactory : public SplitterFactory
{
public:
virtual ISplitter *createSplitter()
{
return new BinarySplitter();
}
};
class TxtSplitterFactory : public SplitterFactory
{
public:
virtual ISplitter *createSplitter()
{
return new TxtSplitter();
}
};
class VideoSplitterFactory : public SplitterFactory
{
public:
virtual ISplitter *createSplitter()
{
return new VideoSplitter();
}
};
二、原型模式
原型模式就是通过clone方法,将Implement基类和对应的工厂类合二为一
// 抽象类
class ISplitter
{
public:
virtual void split() = 0;
virtual ISplitter* clone() = 0;
virtual ~ISplitter() {}
};
// 具体Implement类
class BinarySplitter : public ISplitter
{
public:
virtual ISplitter *clone()
{
return new BinarySplitter(*this);
}
};
class TxtSplitter : public ISplitter
{
public:
virtual ISplitter *clone()
{
return new TxtSplitter(*this);
}
};
class VideoSplitter : public ISplitter
{
public:
virtual ISplitter *clone()
{
return new TxtSplitter(*this);
}
};
调用方法如下
原型对象只能被克隆,不能被直接使用
class MainForm: public Form
{
ISplitter* prototype; //原型对象
public:
MainFrom(ISplitter* prototype)
{
this->prototype(prototype)
}
void Button1_Click()
{
// 通过克隆原型得到新的对象
ISplitter* splitter = prototype->clone();
splitter->set_name("Splitter");
splitter->set_width(300);
splitter->set_height(300);
splitter->set_min_width(100);
splitter->set_min_height(100);
splitter->set_max_width(500);
splitter->set_max_height(500);
}
};