欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式:Factory Method

程序员文章站 2022-03-14 13:57:20
...

一、工厂方法模式
设计模式:Factory Method
面向接口编程:为了支持未来的变化,需要声明的时候用抽象类而不是具体的类。
例: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():

设计模式:Factory Method

class SpliteFactory{};//创建接口的对象
class BinarySplitterFactory:public SplitterFactory{};//让紫烈决定实例化类

设计模式:Factory Method
设计模式:Factory Method
紧耦合:需求一有变化就要去改一些代码;
松耦合:就是扩展性好,不需要修改代码,只需要去加一些代码即可。

相关标签: C++工程师