对象模型——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();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本