單件模式(SINGLETON): 意圖 :保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。 動(dòng)機(jī) :對(duì)于一些類來說,只有一個(gè)實(shí)例是很重要的。比如董事長是一個(gè)類,不同的公司可以有不同的董事長,但是一個(gè)公司只能有一個(gè)董事長,來對(duì)公司的各項(xiàng)決議做最終決定。 思考 :我們?cè)趺醋霾拍苁沟眠@一個(gè)類只有一個(gè)實(shí)例并且實(shí)例易于被訪問?全局變量是我們思考的一種方法,但是全局變量并不能使實(shí)例唯一化。 解決辦法 :讓類自身負(fù)責(zé)保存它的唯一實(shí)例。這個(gè)類可以保證沒有其他實(shí)例被創(chuàng)建,并且可以提供一個(gè)可以訪問該實(shí)例的方法。 廢話不多說,看實(shí)例代碼:
class Singleton
{
public :
static Singleton* Instance ( ) ; //供外部訪問該單件的接口
protected :
Singleton ( ) { } ; //構(gòu)造函數(shù),保護(hù)起來,防止被意外實(shí)例化
private :
static Singleton* __Instance; //用來保存唯一實(shí)例
} ;
Singleton* Singleton:: __Instance = NULL ; //初始化
Singleton* Singleton:: Instance ( )
{
if ( __Instance == NULL )
{
__Instance = new Singleton;
}
return __Instance;
}
void main ( )
{
Singleton* v1 = Singleton:: Instance ( ) ;
//v1 = 0x000d6a38 {...}
Singleton* v2 = Singleton:: Instance ( ) ;
v2 = 0x000d6a38 {...}和v1指向同一片地址
//Singleton* v3 = new Singleton;//會(huì)發(fā)出不可訪問的錯(cuò)誤報(bào)告
//Singleton v4;//會(huì)發(fā)出不可訪問的錯(cuò)誤報(bào)告
system ( "pause" ) ;
getchar ( ) ;
}
抽象工廠模式(ABSTRACT FACTORY): 意圖 :提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定他們具體的類。 動(dòng)機(jī) :生活中我們可能會(huì)遇到同樣的東西,在具體的不同的領(lǐng)域有不同的表現(xiàn)形式。當(dāng)提供一個(gè)產(chǎn)品類庫,只是想顯示他們的接口而不是實(shí)現(xiàn)時(shí),可以使用抽象工廠。就比如動(dòng)物吃飯,動(dòng)物是一個(gè)類,但是具體到某一種動(dòng)物有自己的吃飯方式。 思考 :我們?nèi)绾稳プ龅骄唧w不同的動(dòng)物類型,去做自己的事情呢?將動(dòng)物定義為一個(gè)抽象類便可以解決。 解決辦法 :我們定義抽象類之后,客戶只需要和抽象類定義的接口交互,而不使用特定的具體類的接口。 代碼:
class ProductA //純虛接口A
{
public :
virtual void Show ( ) = 0 ;
} ;
class ProductA1 : public ProductA
{
public :
void Show ( )
{
cout << "This is ProductA1" << endl;
}
} ;
class ProductA2 : public ProductA
{
public :
void Show ( )
{
cout << "This is ProductA2" << endl;
}
} ;
class ProductB //純虛接口B
{
public :
virtual void Show ( ) = 0 ;
} ;
class ProductB1 : public ProductB
{
public :
void Show ( )
{
cout << "This is ProductB1" << endl;
}
} ;
class ProductB2 : public ProductB
{
public :
void Show ( )
{
cout << "This is ProductB2" << endl;
}
} ;
class Factory //抽象基類
{
public :
virtual ProductA * CreateProductA ( ) = 0 ;
virtual ProductB * CreateProductB ( ) = 0 ;
} ;
class Factory1 : public Factory//工廠1
{
public :
static Factory1* Instance ( ) ;
ProductA * CreateProductA ( )
{
return new ProductA1 ( ) ;
}
ProductB * CreateProductB ( )
{
return new ProductB1 ( ) ;
}
protected :
Factory1 ( ) { } ;
private :
static Factory1* __Instance1; //保證只有一個(gè)實(shí)例
} ;
Factory1* Factory1:: __Instance1 = NULL ;
Factory1* Factory1:: Instance ( )
{
if ( __Instance1 == NULL )
{
__Instance1 = new Factory1 ( ) ;
}
return __Instance1;
}
class Factory2 : public Factory//工廠2
{
public :
static Factory2* Instance ( ) ;
ProductA * CreateProductA ( )
{
return new ProductA2 ( ) ;
}
ProductB * CreateProductB ( )
{
return new ProductB2 ( ) ;
}
protected :
Factory2 ( ) { } ;
private :
static Factory2* __Instance2; //保證只有一個(gè)實(shí)例
} ;
Factory2* Factory2:: __Instance2 = NULL ;
Factory2* Factory2:: Instance ( )
{
if ( __Instance2 == NULL )
{
__Instance2 = new Factory2 ( ) ;
}
return __Instance2;
}
“We all get to the peak together or we don’t get there at all.” 參考資料: 《設(shè)計(jì)模式》 學(xué)習(xí)鏈接: https://blog.csdn.net/CoderAldrich/article/details/83114687