總體來說設計模式分為三大類:
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共十一種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。
參考
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對應的産品傳回
工廠模式:
- 不需要産品号
- 有抽象工廠類
- 有具體工廠類
- 建立過程延遲到子類
抽象工廠模式:
- 是指定義一個建立一些列相關或互相依賴的對象接口,而(接口)無需指定它們具體的類
很好的工廠方法和抽象工廠例子
汽車的例子