最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++工廠方法之對象創(chuàng)建型模式詳解

 更新時(shí)間:2022年03月11日 09:47:56   作者:早睡身體好hh  
這篇文章主要為大家詳細(xì)介紹了C++對象創(chuàng)建型模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1.代碼示例

工廠方法模式,簡稱工廠模式或者多態(tài)工廠模式。與簡單工廠模式相比,引入了更多的新類,靈活性更強(qiáng),實(shí)現(xiàn)也更加復(fù)雜。符合開閉原則,付出的代價(jià)是需要新增加多個(gè)新的工廠類。

如下,M_UndeadFactoryM_ElementFactory、M_MechanicFactory 類有一個(gè)共同的父類 M_ParFactory(工廠抽象類)。

M_ParFactory 類中的 createMonster 成員函數(shù)其實(shí)就是個(gè)工廠方法,工廠方法模式的名字也是由此而來。

#include <iostream>
using namespace std;
// 怪物父類
class Monster
{
public:
	// 構(gòu)造函數(shù)
	Monster(int life, int magic, int attack) : m_life(life), m_magic(magic), m_attack(attack) {}
	virtual ~Monster() {} // 父類的析構(gòu)函數(shù)應(yīng)該為虛函數(shù)
protected: // 可能被子類訪問的成員,所以用protected修飾
	int m_life; // 生命值
	int m_magic; // 魔法值
	int m_attack; // 攻擊力
};
// 亡靈類怪物
class M_Undead : public Monster
{
public:
	// 構(gòu)造函數(shù)
	M_Undead(int life, int magic, int attack) : Monster(life, magic, attack)
	{
		cout << "一個(gè)亡靈類怪物來到了這個(gè)世界" << endl;
	}
	// 其他代碼略
};
// 元素類怪物
class M_Element : public Monster
{
public:
	// 構(gòu)造函數(shù)
	M_Element(int life, int magic, int attack) : Monster(life, magic, attack)
	{
		cout << "一個(gè)元素類怪物來到了這個(gè)世界" << endl;
	}
	// 其他代碼略
};
// 機(jī)械類怪物
class M_Mechanic : public Monster
{
public:
	// 構(gòu)造函數(shù)
	M_Mechanic(int life, int magic, int attack) : Monster(life, magic, attack)
	{
		cout << "一個(gè)機(jī)械類怪物來到了這個(gè)世界" << endl;
	}
	// 其他代碼略
};
// 所有工廠類的父類
class M_ParFactory
{
public:
	virtual Monster* createMonster() = 0; // 具體實(shí)現(xiàn)在子類中進(jìn)行
	virtual ~M_ParFactory() {} // 父類的析構(gòu)函數(shù)應(yīng)該為虛函數(shù)
};
// M_Undead怪物類型的工廠,生產(chǎn)M_Undead類型怪物
class M_UndeadFactory : public M_ParFactory
{
public:
	virtual Monster* createMonster()
	{
		Monster *ptmp = new M_Undead(300, 50, 80); // 創(chuàng)建亡靈類怪物
		//這里可以增加一些其他業(yè)務(wù)代碼
		return ptmp;
	}
};
// M_Element怪物類型的工廠,生產(chǎn)M_Element類型怪物
class M_ElementFactory : public M_ParFactory
{
public:
	virtual Monster* createMonster()
	{
		return new M_Element(200, 80, 100); // 創(chuàng)建元素類怪物
	}
};
// M_Mechanic怪物類型的工廠,生產(chǎn)M_Mechanic類型怪物
class M_MechanicFactory : public M_ParFactory
{
public:
	virtual Monster* createMonster()
	{
		return new M_Mechanic(400, 0, 110); // 創(chuàng)建機(jī)械類怪物
	}
};
// 全局函數(shù):用于創(chuàng)建怪物對象
// 注意:形參的類型是工廠父類類型的指針,返回類型是怪物父類類型的指針
Monster* Gbl_CreateMonster(M_ParFactory* factory)
{
	return factory->createMonster();
	// createMonster虛函數(shù)扮演了多態(tài)new的行為,factory指向的具體怪物工廠類不同,創(chuàng)建的怪物對象也不同
}
int main()
{
	M_ParFactory* p_ud_fy = new M_UndeadFactory(); // 多態(tài)工廠,注意指針類型
	Monster* pM1 = Gbl_CreateMonster(p_ud_fy); // 產(chǎn)生了一只亡靈類怪物,也是多態(tài),注意返回類型
	// 當(dāng)然,這里也可以直接寫成 Monster *pM1 = p_ud_fy->createMonster();
	M_ParFactory* p_elm_fy = new M_ElementFactory();
	Monster *pM2 = Gbl_CreateMonster(p_elm_fy); // 產(chǎn)生了一只元素類怪物
	M_ParFactory* p_mec_fy = new M_MechanicFactory();
	Monster* pM3 = Gbl_CreateMonster(p_mec_fy); // 產(chǎn)生了一只機(jī)械類怪物
	// 釋放工廠
	delete p_ud_fy;
	delete p_elm_fy;
	delete p_mec_fy;
	// 釋放怪物
	delete pM1;
	delete pM2;
	delete pM3;
	return 0;
}

簡單工廠模式把創(chuàng)建對象這件事放到了一個(gè)統(tǒng)一的地方來處理,彈性比較差。而工廠方法模式相當(dāng)于建立了一個(gè)程序?qū)崿F(xiàn)框架,從而讓子類來決定對象如何創(chuàng)建。

工廠方法模式往往需要?jiǎng)?chuàng)建一個(gè)與產(chǎn)品等級(jí)結(jié)構(gòu)(層次)相同的工廠等級(jí)結(jié)構(gòu),這也增加了新類的層次結(jié)構(gòu)和數(shù)目。

如果不想創(chuàng)建太多工廠類,又想封裝變化,則可以創(chuàng)建怪物工廠子類模板。

#include <iostream>
using namespace std;
// 怪物父類
class Monster
{
public:
	// 構(gòu)造函數(shù)
	Monster(int life, int magic, int attack) : m_life(life), m_magic(magic), m_attack(attack) {}
	virtual ~Monster() {} // 父類的析構(gòu)函數(shù)應(yīng)該為虛函數(shù)
protected: // 可能被子類訪問的成員,所以用protected修飾
	int m_life; // 生命值
	int m_magic; // 魔法值
	int m_attack; // 攻擊力
};
// 亡靈類怪物
class M_Undead : public Monster
{
public:
	// 構(gòu)造函數(shù)
	M_Undead(int life, int magic, int attack) : Monster(life, magic, attack)
	{
		cout << "一個(gè)亡靈類怪物來到了這個(gè)世界" << endl;
	}
	// 其他代碼略
};
// 元素類怪物
class M_Element : public Monster
{
public:
	// 構(gòu)造函數(shù)
	M_Element(int life, int magic, int attack) : Monster(life, magic, attack)
	{
		cout << "一個(gè)元素類怪物來到了這個(gè)世界" << endl;
	}
	// 其他代碼略
};
// 機(jī)械類怪物
class M_Mechanic : public Monster
{
public:
	// 構(gòu)造函數(shù)
	M_Mechanic(int life, int magic, int attack) : Monster(life, magic, attack)
	{
		cout << "一個(gè)機(jī)械類怪物來到了這個(gè)世界" << endl;
	}
	// 其他代碼略
};
// 所有工廠類的父類
class M_ParFactory
{
public:
	virtual Monster* createMonster() = 0; // 具體實(shí)現(xiàn)在子類中進(jìn)行
	virtual ~M_ParFactory() {} // 父類的析構(gòu)函數(shù)應(yīng)該為虛函數(shù)
};
template <typename T>
class M_ChildFactory :public M_ParFactory
{
public:
	virtual Monster* createMonster()
	{
		return new T(300, 50, 80); //如果需要不同的值則可以通過createMonster的形參將值傳遞進(jìn)來
	}
};
int main()
{
	M_ChildFactory<M_Undead> myFactory;
	Monster* pM10 = myFactory.createMonster();
	// 釋放資源
	delete pM10;
	getchar();
	return 0;
}

UML 如下:

在這里插入圖片描述

2.工廠方法模式的定義(實(shí)現(xiàn)意圖)

定義一個(gè)用于創(chuàng)建對象的接口(M_ParFactory類中的createMonster成員函數(shù)),由子類(M_UndeadFactory、M_ElementFactory、M_MechanicFactory)決定要實(shí)例化的類是哪一個(gè)。該模式使得某個(gè)類(M_Undead、M_Element、M_Mechanic)的實(shí)例化延遲到子類(M_UndeadFactory、M_ElementFactory、M_MechanicFactory)。

一般可以認(rèn)為,將簡單工廠模式的代碼經(jīng)過把工廠類進(jìn)行抽象改造成符合開閉原則后的代碼,就變成了工廠方法模式的代碼。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • C語言實(shí)現(xiàn)小貓釣魚算法

    C語言實(shí)現(xiàn)小貓釣魚算法

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)小貓釣魚算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Linux vmstat命令實(shí)戰(zhàn)詳細(xì)解析

    Linux vmstat命令實(shí)戰(zhàn)詳細(xì)解析

    這個(gè)命令是我查看Linux/Unix最喜愛的命令,一個(gè)是Linux/Unix都支持,二是相比top,我可以看到整個(gè)機(jī)器的CPU,內(nèi)存,IO的使用情況,而不是單單看到各個(gè)進(jìn)程的CPU使用率和內(nèi)存使用率(使用場景不一樣)
    2013-09-09
  • C語言入門篇--初識(shí)C語言及數(shù)據(jù)類型

    C語言入門篇--初識(shí)C語言及數(shù)據(jù)類型

    本篇文章是c語言基礎(chǔ)篇,主要為大家介紹了C語言的基本類型,為大家介紹了什么是C語言,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C# interface與delegate效能比較的深入解析

    C# interface與delegate效能比較的深入解析

    本篇文章是對C#中interface與delegate的效能比較進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • VScode + keil開發(fā)環(huán)境搭建安裝使用過程

    VScode + keil開發(fā)環(huán)境搭建安裝使用過程

    這篇文章主要介紹了VScode + keil開發(fā)環(huán)境搭建及安裝使用過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • C語言goto語句簡單使用詳解

    C語言goto語句簡單使用詳解

    C語言中提供了可以隨意濫用的 goto語句和標(biāo)記跳轉(zhuǎn)的標(biāo)號(hào),本文主要介紹了C語言goto語句簡單使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    C語言實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)教務(wù)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C調(diào)用C++代碼的方法步驟

    C調(diào)用C++代碼的方法步驟

    本文主要介紹了C調(diào)用C++代碼的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C/C++使用Zlib實(shí)現(xiàn)文件的壓縮與解壓

    C/C++使用Zlib實(shí)現(xiàn)文件的壓縮與解壓

    zlib 是一個(gè)開源的數(shù)據(jù)壓縮庫,旨在提供高效、輕量級(jí)的壓縮和解壓縮算法,本文將介紹如何使用 zlib 庫進(jìn)行數(shù)據(jù)的壓縮和解壓縮,以及如何保存和讀取壓縮后的文件,感興趣的可以了解下
    2023-11-11
  • C++數(shù)據(jù)結(jié)構(gòu)深入探究棧與隊(duì)列

    C++數(shù)據(jù)結(jié)構(gòu)深入探究棧與隊(duì)列

    棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊(duì)列實(shí)現(xiàn)棧與用棧實(shí)現(xiàn)隊(duì)列
    2022-05-05

最新評(píng)論

当雄县| 罗定市| 太康县| 通榆县| 崇仁县| 宣城市| 济源市| 安宁市| 保山市| 新宁县| 耒阳市| 临潭县| 浮梁县| 淳安县| 关岭| 安宁市| 云南省| 迁西县| 娱乐| 彰武县| 虹口区| 岳西县| 乌拉特前旗| 四平市| 柘荣县| 搜索| 万宁市| 阳城县| 汪清县| 金沙县| 石狮市| 阿克苏市| 北京市| 鄢陵县| 中西区| 禹城市| 三河市| 荔浦县| 赤城县| 耒阳市| 黎平县|