天天看點

c++23中設計模式之單例模式、工廠方法、抽象工廠

總體來說設計模式分為三大類:

建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

行為型模式,共十一種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。

參考

https://www.csdn.net/gather_2a/MtzaYgwsNTEtYmxvZwO0O0OO0O0O.html

https://blog.csdn.net/taiyang1987912/article/category/2859245/2?

别人總結23種模式

#單例模式

確定某一個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。

#include <iostream>
using namespace std;
class Singleton
{
private:		//構造和成員變量 通路權限為private
	Singleton()
	{
	}
	static Singleton* instance;
public:
	static Singleton* getInstance()
	{
		if (instance == NULL)
		{
			instance = new Singleton();
		}
		return instance;
	}
	void say()
	{
		cout << "我是唯一的" << endl;
	}

};
/*********************************************************
靜态變量初始化格式:   <資料類型><類名>::<靜态資料成員名>=<值>
前面不加static,以免與一般靜态變量或對象相混淆
靜态變量需在<類外>&&<實作>中初始化,不能在<.h>初始化
*********************************************************/
Singleton* Singleton::instance = 0;    

int main()
{
	Singleton * singleton = Singleton::getInstance();
	singleton->say();
	system("pause");
	return 0;
}
           

單線程時這樣寫隻有一個執行個體,而多線程時可能會有多個,需要用鎖Lock() 和~Lock()

#工廠模式

##簡單工廠(并不屬于23種模式)

産品号定義如下:

enum PhoneType {
	HuaweiType,
	XiaomiType
};
           

産品如下:

//abstract product
class Phone {
public:
	virtual void show() = 0;
};
//concrete product HuaWei
class HuaWeiPhone : public Phone {
public:
	void show() {
		std::cout << "HuaWeiPhone" << endl;
	}
};
//concrete product XiaoMi
class XiaoMiPhone : public Phone {
public:
	void show() {
		std::cout << "XiaoMiPhone" << endl;
	}
};

           

工廠如下:

//concrete factory
class PhoneFactory {
public:
	Phone* CreatePhone(PhoneType type) {
		if (HuaweiType == type) {
			return new HuaWeiPhone();
		} else if (XiaomiType == type) {
			return new XiaoMiPhone();
		}
	}
};
           

main如下:

int main(int argc, char* argv[]) {
	PhoneFactory factory;
	Phone* phone = factory.CreatePhone(HuaweiType);
	phone->show();

	phone = factory.CreatePhone(XiaomiType);
	phone->show();

	system("pause");
	return 0;
}
           

##工廠方法

産品同上

工廠發生變化:

//abstract factory
class Factory {
public:
	virtual Phone* CreatePhone() = 0;
};
//concrete factory HuaWei
class HuaWeiFactory : public Factory {
public:
	Phone* CreatePhone() {
		return new HuaWeiPhone();
	}
};
//concrete factory XiaoMi
class XiaoMiFactory : public Factory {
public:
	Phone* CreatePhone() {
		return new XiaoMiPhone();
	}
};
           

main:

int main(int argc, char* argv[]) {
	HuaWeiFactory huaWeiFactory;
	Phone* phone = huaWeiFactory.CreatePhone();
	phone->show();

	XiaoMiFactory xiaoMiFactory;
	phone = xiaoMiFactory.CreatePhone();
	phone->show();

	system("pause");
	return 0;
}
           

隻生産一個産品“phone”,可以加具體産品VIvoPhone,IPhone,增加具體工廠VivoFactory,IPhoneFactory,都是屬于工廠方法

##抽象工廠

新增加産品watch:

//abstract product
class Watch {
public:
	virtual void show() = 0;
};
//concrete product HuaWei
class HuaWeiWatch : public Watch {
public:
	void show() {
		std::cout << "HuaWeiWatch" << endl;
	}
};
//concrete product XiaoMi
class XiaoMiWatch : public Watch {
public:
	void show() {
		std::cout << "XiaoMiWatch" << endl;
	}
};
           

工廠如下:

//abstract factory
class Factory {
public:
	virtual Phone* CreatePhone() = 0;
	virtual Watch* CreateWatch() = 0;
};
//concrete factory HuaWei
class HuaWeiFactory : public Factory {
public:
	Phone* CreatePhone() {
		return new HuaWeiPhone();
	}

	Watch* CreateWatch() {
		return new HuaWeiWatch();
	}
};
//concrete factory XiaoMi
class XiaoMiFactory : public Factory {
public:
	Phone* CreatePhone() {
		return new XiaoMiPhone();
	}

	Watch* CreateWatch() {
		return new	XiaoMiWatch();
	}
};
           

main如下:

int main(int argc, char* argv[]) {
	HuaWeiFactory huaWeiFactory;
	Phone* phone = huaWeiFactory.CreatePhone();
	phone->show();
	Watch* watch = huaWeiFactory.CreateWatch();
	watch->show();

	XiaoMiFactory xiaoMiFactory;
	phone = xiaoMiFactory.CreatePhone();
	phone->show();
	watch = xiaoMiFactory.CreateWatch();
	watch->show();

	system("pause");
	return 0;
}
           
  • 增加新産品watch,工廠不再隻生産phone一種産品,而是多種,還可以增加EletricBrush,EarPhone等新産品
  • Phone:HuaWeiPhone, XiaoMiPhone是一課産品樹;Watch:HuaWeiWatch, XiaoMiWatch又是另一顆産品樹
  • HuaWeiPhone,HuaWeiWatch是一個産品族;XiaoMiPhone,XiaoMiWatch又是一個産品族

總結:

簡單工廠:

  • 産品類型:enum,string,int等定義都行,反正表示一個産品号
  • 工廠類有一個生産方法:根據輸入産品号,函數體裡根據産品号new對應的産品傳回

工廠模式:

  • 不需要産品号
  • 有抽象工廠類
  • 有具體工廠類
  • 建立過程延遲到子類

抽象工廠模式:

  • 是指定義一個建立一些列相關或互相依賴的對象接口,而(接口)無需指定它們具體的類
c++23中設計模式之單例模式、工廠方法、抽象工廠
c++23中設計模式之單例模式、工廠方法、抽象工廠

很好的工廠方法和抽象工廠例子

汽車的例子

繼續閱讀