天天看點

設計模式----工廠方法Factory Method

作者:初春de小草
設計模式----工廠方法Factory Method

對象建立模式

通過“對象建立”模式繞開new, 來避免對象建立(new)過程中所導緻的緊耦合(依賴具體類),進而支援對象建立的穩定。它是接口抽象之後的第一步工作。

典型模式

  • Factory Method 工廠模式
  • Abstract Factory抽象工廠
  • Prototype原型
  • Builder建造者

這四個模式在演化過程中有細微的不同。

01動機(Motivation)

在軟體系統中,經常面臨着建立對象的工作;由于需求的變化,需要建立的對象的具體類型經常變化。

如何應對這種變化?如何繞過正常的對象建立方法(new)提供一種“封裝機制”來避免客戶程式和這種“具體對象建立工作”的緊耦合?

一定要抽絲剝繭去還原它最初的設計場景去了解---》使用一種方法傳回一個對象

設計模式一定要在對比中才有收獲

02模式定義

定義一個用建立對象的接口,讓子類決定執行個體化哪一個類。Factory Method 類使得一個類的執行個體化延遲(目的:解耦,手段:虛函數)到子類。

----《設計模式》GoF

//MainForm2.cpp
class MainForm :public Form
{
	SplitterFactory* factory;

public:
	//變化被趕出去了
	MainForm(SplitterFactory* factory)
	{
		this->factory = factory;//工廠
	}
	void Button1_Click()
	{
		//多态new
		ISplitter* splitter = factory->CreateSplitter();;//依賴具體類
		splitter->aplit();
	}

};           
//FileSplitter2.cpp


//具體類
class BinarySplitter :public ISplitter
{};
class TxtSplitter :public ISplitter
{};
class PictureSplitter :public ISplitter
{};
class VideoSplitter :public ISplitter
{};

//具體工廠  針對具體類建立一系列具體工廠
class BinarySplitterFactory : public SplitterFactory
{
public:
	//改成虛函數,就是運作時依賴了
	virtual ISplitter* CreateSplitter()
	{
		return new BinarySplitter();
	}
};

//具體工廠
class txtSplitterFactory : public SplitterFactory
{
public:
	//改成虛函數,就是運作時依賴了
	virtual ISplitter* CreateSplitter()
	{
		return new TxtSplitter();
	}
};

//具體工廠
class PictureSplitterFactory : public SplitterFactory
{
public:
	//改成虛函數,就是運作時依賴了
	virtual ISplitter* CreateSplitter()
	{
		return new PictureSplitter();
	}
};

//具體工廠
class VideoSplitterFactory : public SplitterFactory
{
public:
	//改成虛函數,就是運作時依賴了
	virtual ISplitter* CreateSplitter()
	{
		return new VideoSplitter();
	}
};           
//FileSplitter1.cpp
//說明:本文集是基于在第8課講工廠模式時使用添加的,不是在講觀察者模式的時候添加的

//1.抽象出基類
class ISplitter
{
public:
	ISplitter();
	virtual void split() = 0;
	virtual ~ISplitter() {}
};

//工廠基類
class SplitterFactory
{

public:
	//改成虛函數,就是運作時依賴了
	virtual ISplitter* CreateSplitter() = 0;
	virtual ~SplitterFactory() {}
};
           

03代碼說明

  • 建立對象的接口
//工廠基類
class SplitterFactory
{

public:
	//改成虛函數,就是運作時依賴了
	virtual ISplitter* CreateSplitter() = 0;//負責建立
	virtual ~SplitterFactory() {}
};
           
  • 讓子類(BinarySplitterFactory)決定執行個體化哪個類(BinarySplitter)

子類:txtSplitterFactory 決定執行個體化TxtSplitter

子類:PictureSplitterFactory決定執行個體化PictureSplitter

子類:VideoSplitterFactory決定執行個體化VideoSplitter

設計模式----工廠方法Factory Method

延遲而非更改。

04 要點總結

Factory Method模式用于隔離類對象的使用者和具體類型之間的耦合關系。面對一個經常變化的具體類型,耦合關系(new)會導緻軟體的脆弱。

Factory Method 模式通過面向對象的手法,将所要建立的具體對象工作延遲到子類,進而實作一種擴充(而非更改)的政策,較好地解決了這種緊耦合關系。

Factory Method 模式解決“單個對象”的需求變化。缺點在于要求建立 方法/參數相同。

繼續閱讀