單件模式(SINGLETON): 意圖 :保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 動機 :對于一些類來說,只有一個實例是很重要的。比如董事長是一個類,不同的公司可以有不同的董事長,但是一個公司只能有一個董事長,來對公司的各項決議做最終決定。 思考 :我們怎么做才能使得這一個類只有一個實例并且實例易于被訪問?全局變量是我們思考的一種方法,但是全局變量并不能使實例唯一化。 解決辦法 :讓類自身負(fù)責(zé)保存它的唯一實例。這個類可以保證沒有其他實例被創(chuàng)建,并且可以提供一個可以訪問該實例的方法。 廢話不多說,看實例代碼:
class Singleton
{
public :
static Singleton* Instance ( ) ; //供外部訪問該單件的接口
protected :
Singleton ( ) { } ; //構(gòu)造函數(shù),保護起來,防止被意外實例化
private :
static Singleton* __Instance; //用來保存唯一實例
} ;
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;//會發(fā)出不可訪問的錯誤報告
//Singleton v4;//會發(fā)出不可訪問的錯誤報告
system ( "pause" ) ;
getchar ( ) ;
}
抽象工廠模式(ABSTRACT FACTORY): 意圖 :提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定他們具體的類。 動機 :生活中我們可能會遇到同樣的東西,在具體的不同的領(lǐng)域有不同的表現(xiàn)形式。當(dāng)提供一個產(chǎn)品類庫,只是想顯示他們的接口而不是實現(xiàn)時,可以使用抽象工廠。就比如動物吃飯,動物是一個類,但是具體到某一種動物有自己的吃飯方式。 思考 :我們?nèi)绾稳プ龅骄唧w不同的動物類型,去做自己的事情呢?將動物定義為一個抽象類便可以解決。 解決辦法 :我們定義抽象類之后,客戶只需要和抽象類定義的接口交互,而不使用特定的具體類的接口。 代碼:
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; //保證只有一個實例
} ;
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; //保證只有一個實例
} ;
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è)計模式》 學(xué)習(xí)鏈接: https://blog.csdn.net/CoderAldrich/article/details/83114687