设计模式之单例模式(Singleton)摘录
23種GOF設(shè)計(jì)模式一般分為三大類(lèi):創(chuàng)建型模式、結(jié)構(gòu)型模式、行為模式。
創(chuàng)建型模式包括:1、FactoryMethod(工廠方法模式);2、Abstract Factory(抽象工廠模式);3、Singleton(單例模式);4、Builder(建造者模式);5、Prototype(原型模式).
結(jié)構(gòu)型模式包括:6、Bridge(橋接模式);7、Adapter(適配器模式);8、Decorator(裝飾模式);9、Composite(組合模式);10、Flyweight(享元模式);11、Facade(外觀模式);12、Proxy(代理模式).
行為模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(狀態(tài)模式);16、Observer(觀察者模式);17、Memento(備忘錄模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(訪問(wèn)者模式);21、Chain of Responsibility(責(zé)任鏈模式);22、Iterator(迭代器模式);23、Interpreter(解釋器模式).
Factory Method:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定將哪一個(gè)類(lèi)實(shí)例化。Factory Method使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。
Abstract Factory:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定他們具體的類(lèi)。
Singleton:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。
Builder:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
Prototype:用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這個(gè)原型來(lái)創(chuàng)建新的對(duì)象。
Bridge:將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。
Adapter:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。
Decorator:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就擴(kuò)展功能而言, Decorator模式比生成子類(lèi)方式更為靈活。
Composite:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得客戶(hù)對(duì)單個(gè)對(duì)象和復(fù)合對(duì)象的使用具有一致性。
Flyweight:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。
Facade:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面, Facade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。
Proxy:為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
Template Method:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。Template Method使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
Strategy:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換。本模式使得算法的變化可獨(dú)立于使用它的客戶(hù)。
State:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它所屬的類(lèi)。
Observer:定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并自動(dòng)刷新。
Memento:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到保存的狀態(tài)。
Mediator:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
Command:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可取消的操作。
Visitor:表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類(lèi)的前提下定義作用于這些元素的新操作。
Chain of Responsibility:為解除請(qǐng)求的發(fā)送者和接收者之間耦合,而使多個(gè)對(duì)象都有機(jī)會(huì)處理這個(gè)請(qǐng)求。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它。
Iterator:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又不需暴露該對(duì)象的內(nèi)部表示。
Interpreter:給定一個(gè)語(yǔ)言, 定義它的文法的一種表示,并定義一個(gè)解釋器, 該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。
?
???????? Singleton:(1)、意圖:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn);(2)、適用性:當(dāng)類(lèi)只能有一個(gè)實(shí)例而且客戶(hù)可以從一個(gè)眾所周知的訪問(wèn)點(diǎn)訪問(wèn)它時(shí);當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過(guò)子類(lèi)化可擴(kuò)展的,并且客戶(hù)應(yīng)該無(wú)需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí);(3)、優(yōu)點(diǎn):A、對(duì)唯一實(shí)例的受控訪問(wèn):因?yàn)镾ingleton類(lèi)封裝它的唯一實(shí)例,所以它可以嚴(yán)格的控制客戶(hù)怎樣以及何時(shí)訪問(wèn)它;B、縮小名空間:Singleton模式是對(duì)全局變量的一種改進(jìn),它避免了那些存儲(chǔ)唯一實(shí)例的全局變量污染名空間;C、允許對(duì)操作和表示的精化:Singleton類(lèi)可以有子類(lèi),而且用這個(gè)擴(kuò)展類(lèi)的實(shí)例來(lái)配置一個(gè)應(yīng)用是很容易的,你可以用你所需要的類(lèi)的實(shí)例在運(yùn)行時(shí)刻配置應(yīng)用;D、允許可變數(shù)目的實(shí)例:這個(gè)模式使得你易于改變你的想法,并允許Singleton類(lèi)的多個(gè)實(shí)例。此外,你可以用相同的方法來(lái)控制應(yīng)用所使用的實(shí)例的數(shù)目。只有允許訪問(wèn)Singleton實(shí)例的操作需要改變;E、比類(lèi)操作更靈活:另一種封裝Singleton功能的方式是使用類(lèi)操作(即C++中的靜態(tài)成員函數(shù)或者是Smalltalk中的類(lèi)方法)。但這兩種語(yǔ)言技術(shù)都難以改變?cè)O(shè)計(jì)以允許一個(gè)類(lèi)有多個(gè)實(shí)例。此外,C++中的靜態(tài)成員函數(shù)不是虛函數(shù),因此子類(lèi)不能多態(tài)的重定義它們。
示例代碼1:
#include <iostream>
#include <string>
#include <vector>using namespace std;class Singleton
{
private:Singleton() {}static Singleton* single;public:static Singleton* GetInstance(){if (single == NULL) {single = new Singleton();}return single;}
};Singleton* Singleton::single = NULL;//靜態(tài)變量類(lèi)外初始化//客戶(hù)端
int main()
{Singleton* s1 = Singleton::GetInstance();Singleton* s2 = Singleton::GetInstance();if (s1 == s2) cout<<"ok"<<endl;elsecout<<"no"<<endl;/*result:ok*/return 0;
}
示例代碼2:
Singleton.h:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_#include <iostream>
using namespace std;class Singleton
{
public:static Singleton* Instance();
protected:Singleton();//Singleton不可以被實(shí)例化,因此將其構(gòu)造函數(shù)聲明為protected或者直接聲明為private
private:static Singleton* _instance;
};#endif//~_SINGLETON_H_
Singleton.cpp:
#include "Singleton.h"#include <iostream>
using namespace std;Singleton* Singleton::_instance = 0;Singleton::Singleton()
{cout<<"Singleton ..."<<endl;
}Singleton* Singleton::Instance()
{if (_instance == 0) _instance = new Singleton();return _instance;
}
main.cpp:
#include "Singleton.h"#include <iostream>
using namespace std;int main()
{Singleton* sgn = Singleton::Instance();/*result:Singleton ...*/return 0;
}
單例模式結(jié)構(gòu)圖:
參考文獻(xiàn):
1、《大話設(shè)計(jì)模式C++》
2、《設(shè)計(jì)模式精解----GoF23種設(shè)計(jì)模式解析》
3、《設(shè)計(jì)模式----可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
總結(jié)
以上是生活随笔為你收集整理的设计模式之单例模式(Singleton)摘录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++中的封装、继承、多态
- 下一篇: 设计模式之建造者模式(生成器模式、Bui