对象模型——Factory Method

含义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类中。

别名:虚构造器

  1. 该模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  2. 该模式通过向面向对象的手法,将所需要创建的具体对象工作延迟到子类中,从而实现一种扩展(而非i更改)的策略,较好地解决了这种紧耦合关系。
  3. 该模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

虚函数是运行时依赖

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();
	}
}
posted @ 2023-03-07 12:54  摩天仑  阅读(13)  评论(0编辑  收藏  举报