对象模型——Factory Method
含义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类中。
别名:虚构造器
- 该模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
- 该模式通过向面向对象的手法,将所需要创建的具体对象工作延迟到子类中,从而实现一种扩展(而非i更改)的策略,较好地解决了这种紧耦合关系。
- 该模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。
虚函数是运行时依赖
1
class MainForm : public Form{
TextBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressBar;
public:
void Button1_click(){
string filePath = txtFilePath->getText();
int number = atoi(txtFileNumber->getText.c_str());
// 虽然splitter是抽象类,但是还是依赖具体的类BinarySplitter实现。
ISplitter* splitter = new BinarySplitter(filePath,number);
splitter->split();
}
}
class ISplitter{
virtual void split() = 0;
~ISplitter(){};
};
class BinarySplitter : public ISplitter{
virtual void split(){
}
}
class ImageSplitter : public ISplitter{
virtual void split(){
}
}
class VideoSplitter : public ISplitter{
virtual void split(){
}
}
class MusicSplitter : public ISplitter{
virtual void split(){
}
}
2
class MainForm : public Form{
TextBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressBar;
public:
void Button1_click(){
string filePath = txtFilePath->getText();
int number = atoi(txtFileNumber->getText.c_str());
// 使用一个抽象类,定义一个函数返回对象
SplitterFactory* factory;
ISplitter* splitter = factory->createSplitter();
splitter->split();
}
}
class SplitterFactory{
// 虚函数是运行时依赖,而不是编译时依赖
virtual ISplitter* createSplitter() = 0;
~SplitterFactory(){};
}
class ISplitter{
virtual void split() = 0;
~ISplitter(){};
};
3
class MainForm : public Form{
TextBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressBar;
// 使用一个抽象类,定义一个函数返回对象
// 一般只需要一个工厂即可
SplitterFactory* factory;
public:
MainForm(SplitterFactory* factory){
this.factory = factory;
}
void Button1_click(){
string filePath = txtFilePath->getText();
int number = atoi(txtFileNumber->getText.c_str());
ISplitter* splitter = factory->createSplitter();
splitter->split();
}
}
每个具体对象都对应一个具体的工厂
class ISplitter{
virtual void split() = 0;
~ISplitter(){};
};
class BinarySplitter : public ISplitter{
virtual void split(){
}
}
class ImageSplitter : public ISplitter{
virtual void split(){
}
}
class VideoSplitter : public ISplitter{
virtual void split(){
}
}
class MusicSplitter : public ISplitter{
virtual void split(){
}
}
// 抽象工厂
class SplitterFactory{
// 虚函数是运行时依赖,而不是编译时依赖
virtual ISplitter* createSplitter() = 0;
~SplitterFactory(){};
}
// 具体工厂
class BinarySplitterFactory : public SplitterFactory{
virtual ISplitter* createSplitter(){
return new BinarySplitter();
}
}
class ImageSplitterFactory : public ImageSplitter{
virtual ISplitter* createSplitter(){
return new BinarySplitter();
}
}
class VideoSplitterFactory : public VideoSplitter{
virtual ISplitter* createSplitter(){
return new BinarySplitter();
}
}
class MusicSplitterFactory : public MusicSplitter{
virtual ISplitter* createSplitter(){
return new BinarySplitter();
}
}