设计模式:Factory Method
程序员文章站
2022-03-14 13:57:20
...
一、工厂方法模式
面向接口编程:为了支持未来的变化,需要声明的时候用抽象类而不是具体的类。
例:Student* s1 = new Student;//这个是具体的类,不是面向接口的,改为Person* s1 = new Student;//这里Person就是对Student的抽象类,也就是一个接口。
小结:当你想到了有很多方法,那么就需要去考虑用一个抽象类将这些方法进行抽象。
//如果我们需要写一个分割器,包括:二进制文件分割、文本文件分割、图像文件分割等,那我们就需要抽象一个分割类
class ISplitter{
public:
virtual void split();
virtual ~ISplitter(){};
}
//继承抽象类,写具体的一些类
class BinarySplitter:public ISplitter{
public:
virtual void splite();//对抽象类分割方法进行重写,用于分割二进制文件
};
class TextSplitter:public ISplitter{
public:
virtual void splite();//对抽象类分割方法进行重写,用于分割文本文件
}
class PictureISplitter{
public:
virtual void splite();//对抽象类分割方法进行重写,用于分割文本文件
}
//然后面向接口编程就需要写成
ISplitter* p = new PictureISplitter;//一个抽象类的指针指向一个具体类
p->splite();//调用的是具体类的分割函数,也就是分割图像,依赖具体类
问题:创建抽象类时,右边都需要创建一个具体的类,那么如何动态的创建右边的具体类呢?
A:引入工厂设计模式,思考:创建对象的方式有new,还有一种是可以通过一个函数进行返回一个对象。
也就是写一个函数将所有的具体类进行判断封装,然后根据需要返回具体类。
virtual 是运行时依赖
class ISplitter{
public:
virtual void split();
virtual ~ISplitter(){};
}
class SpliteFactory{
public:
virtual ISplitter* CreateSplitter(){
return new ISpiltter();
}
virtual ~SpliteFactory(){};
};
//创建具体类工厂
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();//ISplitter抽象基类
splitter->split();
}
};
MainForm* mainform = new MainForm(new BinarySplitterFactory());
mainform->Button1_Click():
class SpliteFactory{};//创建接口的对象
class BinarySplitterFactory:public SplitterFactory{};//让紫烈决定实例化类
紧耦合:需求一有变化就要去改一些代码;
松耦合:就是扩展性好,不需要修改代码,只需要去加一些代码即可。