小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

常見設(shè)計(jì)模式--C++基礎(chǔ)

 KookNut39 2021-12-15

單件模式(SINGLETON):
意圖:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
動(dòng)機(jī):對(duì)于一些類來說,只有一個(gè)實(shí)例是很重要的。比如董事長(zhǎng)是一個(gè)類,不同的公司可以有不同的董事長(zhǎng),但是一個(gè)公司只能有一個(gè)董事長(zhǎng),來對(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

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多