getInstance

getInstance

getInstance是一個函數,在java中,可以使用這種方式使用單例模式創建類的實例,所謂單例模式就是一個類有且只有一個實例,不像object ob=new object();的這種方式去實例化後去使用。

函數用法


在寫程序庫代碼時,有時有一個類需要被所有的其它類使用,但又要求這個類只能被實例化一次,是個服務類,定義一次,其它類使用同一個這個類的實例。
例如:
class A
{
public:
A(void);
…..
}
如果在每一個需要A的類中都聲明一個A類的對象,那麼會導致有N個類,每個A類的定義都不一樣,但是這個A類是服務類,又只能定義一次,定義多個A類會導致A類有多個不同的內存地址。
解決這個矛盾的方法:
1.
定義一個A的全局類對象,其它類共同使用這個實例化對象,這樣保證A只實例化一次,使用extern A a聲明一次,在源文件中定義A a即可;
但這種方式有一個問題,就是工程之間的訪問,例如pro1中有A類,pro2需要使用A類,這樣就不能完全保證A類只實例化一次,可能會出現pro1和pro2各實例化一次。
2. 定義靜態的實例化類(Singleton),如下:
class A
{
public:
A(void);
{
static A* a = NULL;
if(a == null)
{
a = new A;
};
return a;
}
……
}
這樣只要包含這個頭文件,
A::GetInstance()->…..
這樣就保證只實例化一次。

用法對比


對象的實例化方法,也是比較多的,最常用的方法是直接使用new,而這是最普通的,如果要考慮到其它的需要,如單實例模式,層次間調用等等。直接使用new就不可以實現好的設計,這時候需要使用間接使用new,即很多人使用的GetInstance方法。這是一個設計方式的代表,而不僅僅指代一個方法名。
new的使用:
如Object _object = new Object(),這時候,就必須要知道可能會有第二個Object的存在,而第二個Object也常常是在當前的域中的,可以被直接調用的
GetInstance的使用:
在主函數開始時調用,返回一個實例化對象。此對象是static的,在內存中保留著它的引用,即內存中有一塊區域專門用來存放靜態方法和變數,可以直接使用,調用多次返回同一個對象。
兩者區別對照:
大部分類(非抽象類/非介面/不屏蔽constructor的類)都可以用new,new就是通過生產一個新的實例對象,或者在棧上聲明一個對象,每部分的調用用的都是一個新的對象。
getInstance是少部分類才有的一個方法,各自的實現也不同。getInstance在單例模式(保證一個類僅有一個實例,並提供一個訪問它的全局訪問點)的類中常見,用來生成唯一的實例,getInstance往往是static的。