工厂模式
文章汇总
原文地址 Github
动机
- 在软件系统中,经常面临着创建对象的工作,由于需求变化,需要创建的对象的具体类型经常变化
- 如何绕过常规的 new 方法,提供一种封装机制来避免客户程序和具体对象创建工作的紧耦合
代码示例
有一个文件分割器类和一个 Form
类,Form
类中需要新建一个文件分割器的对象
// 文件分割器基类
class ISplitter{
public:
virtual void split()=0;
virtual ~ISplitter(){}
};
// 具体的文件分割器类
class BinarySplitter : public ISplitter{
};
// Form 类
class MainForm : public Form
{
TextBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressBar;
public:
void Button1_Click(){
// 紧密耦合
// 面向接口编程 变量声明为抽象基类
ISplitter * splitter=
new BinarySplitter();//依赖具体类 不好
splitter->split();
}
};
采用工厂模式的代码
//抽象类
class ISplitter{
public:
virtual void split()=0;
virtual ~ISplitter(){}
};
//工厂基类
class SplitterFactory{
public:
virtual ISplitter* CreateSplitter()=0;
virtual ~SplitterFactory(){}
};
//具体类
class BinarySplitter : public ISplitter{
};
//具体工厂
class BinarySplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new BinarySplitter();
}
};
class MainForm : public Form
{
// 工厂类的抽象类的引用
SplitterFactory* factory;//工厂
public:
MainForm(SplitterFactory* factory){
this->factory=factory;
}
void Button1_Click(){
ISplitter * splitter=
factory->CreateSplitter(); //多态new
splitter->split();
}
};
这里新建对象的时候,运行时究竟调用了哪个工厂方法新建了哪个对象,是由 MainForm
的 SplitterFactory
的类型决定的,是一种多态的思想。而且对于 MainForm
来说,并不知道具体的工厂类,是面向接口编程,是一种抽象的思想。
参考
https://www.bilibili.com/video/BV1kW411P7KS?from=search&seid=13066287095511349570
求关注~试试新的关注功能
可以写公众号了=-=哈哈哈
其实我的文章主要是 B 站那个视频的总结,当笔记来看吧,真学设计模式,还得系统看书看视频。
嗯嗯学习前辈们精良的讲解/出书大佬的系统性知识~
加油