對象建立模式
通過“對象建立”模式繞開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
延遲而非更改。
04 要點總結