一、
public class UlManager
{private static UlManager instance;private void Awake(){if(instance != null)Destroy(this);else instance = this;}
}
二、
public class UlManager
{private static UlManager instance;public static UlManager Instance{get{if (instance == null)instance = new UlManager();else return instance;}}
}
初始化時機:
第一種方式:在 Awake() 方法中進行初始化。這意味著當對象被實例化時,Awake() 方法會被調用,首先,代碼檢查是否已經存在了該類的一個實例。這通過檢查 instance 變量是否為 null 來實現。如果 instance 不為 null,這意味著已經存在一個實例,那么當前的對象就不需要再存在了,所以使用 Destroy(this) 來銷毀當前對象(即當前腳本所附加的對象)。如果 instance 為 null,則將當前對象賦值給 instance 變量,表示該對象是這個類的實例
第二種方式:在訪問 Instance 屬性時進行初始化。當第一次訪問 Instance 屬性時,會檢查 instance 是否為 null,如果是,則創建一個新的實例并賦值給 instance。
處理重復實例:
第一種方式:在 Awake() 方法中檢查是否已經存在一個實例,如果已經存在則銷毀當前對象,以確保只有一個實例存在。
第二種方式:在 Instance 屬性中檢查是否已經存在一個實例,如果已經存在則直接返回該實例,這樣可以確保只有一個實例存在,并且只有在需要使用實例時才進行初始化。
返回值類型:
第一種方式:沒有提供靜態屬性或方法來獲取實例,因此在外部無法直接訪問實例,也無法使用 UlManager.instance 來獲取實例。如果需要訪問實例,則需要將 instance 字段設置為 public,這樣才能在外部訪問。
第二種方式:通過靜態屬性 Instance 返回實例,外部可以直接通過 UlManager.Instance 訪問單例實例,這樣更加方便。
既然第一種方法無法在外部訪問實例,那為什么還算是單例模式呢?
單例模式的核心思想是確保一個類只有一個實例,并提供全局訪問點來訪問該實例。第一種方法在 Awake() 方法中確保了只有一個實例存在,因此符合單例模式的定義。盡管在外部不能直接訪問實例,但這并不影響它是單例模式的一種實現。
雖然第一種方法不能在外部直接訪問實例,但仍然可以通過提供一些其他方法來訪問實例,例如提供一個靜態方法或屬性來返回實例。再例如,你可以將 instance 字段設置為 public,然后在外部通過 UlManager.instance 來訪問實例。雖然這種方式不夠直觀和安全,但它仍然可以用作單例模式的一種實現。
綜上所述,第一種方法雖然在訪問實例上不夠方便,但它仍然滿足了單例模式的定義,因為它確保了只有一個實例存在,并提供了一種全局訪問該實例的方式。