有的時候我們會碰到這樣的情況:在一個表單中,我們點擊一個按鈕產生一個新的表單,如果我們在代碼中不進行限制的話,再點擊一次按鈕,又會產生一個表單,對於每個表單當然是有一個表單的執行個體和它對應,如果我想在程式中只允許產生一個類的執行個體該怎麼辦呢?其實實現上面不能再產生一個新的表單還是比較簡單的實現的,可以在產生了表單以後我們設定按鈕屬性為不可用:Button1.Enable=false;
但是,我在這裡想實現的是不用讓按鈕不可用,來完成程式只能產生一個類的執行個體的方法:
方法一:
如果一個類你只想一個執行個體對其進行操作,那麼我們可以將類中的域,屬性以及函數都定義為static的,而且我們把建構函式定義成private的,這樣只有類名才能對類裡面的域,屬性還有方法進行訪問了,而且該類也不能在類外建立一個執行個體了。
public class Class2
{
private Class2(){}
public static Type VariableName;
public static Type FunctionName(){}
}
這中方法不適合於WINFORM程式中的表單類。
方法二:
設定一個bool型的變數來表識是否已經建立了一個執行個體。
public class Class2
{
private Class2()
{
}
private static bool instance_flag=false;
public static Class2 GetInstance()
{
if(!instance_flag)
{
Class2 c2=new Class2();
instance_flag=true;
return c2;
}
else
{
Console.WriteLine("you have already create a instance");
return null;
}
}
}
如果已經建立了一個執行個體,那麼instance_flag=true,這樣程式就知道已經有一個執行個體已經建立,將不會建立新的執行個體。
方法三:
在Class2中建立一個類的執行個體,該執行個體是static的,然後在類外面直接用這個執行個體進行賦值,也可通過函數來返回這個類的執行個體。但是這樣的話,就會在編譯的時候就會產生這個類的執行個體,它會浪費資源,效率也不高,可以在需要用到執行個體的時候才產生,代碼如下:
public class Class2
{
private Class2()
{
}
private static Class2 c2=null;
public static Class2 GetInstance()
{
if(c2==null)
{
c2=new Class2();
}
return c2;
}
}
static方法只能訪問static的域。根據以上代碼,在需要使用執行個體的時候,可以用類名來調用GetInstance()方法。來返回一個執行個體。
以上方法不能使用建構函式,因為都將建構函式設定成了private的,目的也是這樣,禁止多次產生執行個體。新手感想,有問題請幫忙指出,謝謝!