以下是範例
C#
class LoginObj { private static LoginObj loginobj; private LoginObj() { } public static LoginObj GetInstance() { if (loginobj == null) { loginobj = new LoginObj(); } return loginobj; } public void SetLoginData() { System.Diagnostics.Debug.Write("Set data"); } public void GetLoginData() { System.Diagnostics.Debug.Write("Get data"); } } class Program { static void Main(string[] args) { LoginObj loginobj = LoginObj.GetInstance(); loginobj.SetLoginData(); loginobj.GetLoginData(); } }
Java
public class loginObj { /** * @param args */ private static loginObj _loginObj; private loginObj(){} public static loginObj GetInstance() { if(_loginObj==null) { _loginObj = new loginObj(); } return _loginObj; } public static void main(String[] args) { // TODO Auto-generated method stub loginObj loginobj = loginObj.GetInstance(); } }上面使用singleton建立唯一的物件來存取以及讀取user login的資料 上面的用法是不考慮multi-thread時的寫法 當該class 會同時被多個thread呼叫時使用上面的寫法還是有可能會Create出兩個物件 所以必須改用以下的寫法
C#
class LoginObj { private static LoginObj loginobj; private static object syncObj = new Object(); private LoginObj() { } public static LoginObj GetInstance() { if (loginobj == null) { lock (syncObj) { if (loginobj == null) { loginobj = new LoginObj(); } } } return loginobj; } public void SetLoginData() { System.Diagnostics.Debug.Write("Set data"); } public void GetLoginData() { System.Diagnostics.Debug.Write("Get data"); } } class Program { static void Main(string[] args) { LoginObj loginobj = LoginObj.GetInstance(); loginobj.SetLoginData(); loginobj.GetLoginData(); } }
Java
public class loginObj { /** * @param args */ private static loginObj _loginObj; private loginObj(){} public static loginObj GetInstance() { if(_loginObj==null) { synchronized(loginObj.class){ if(_loginObj == null) { _loginObj = new loginObj(); } } } return _loginObj; } public static void main(String[] args) { // TODO Auto-generated method stub loginObj loginobj = loginObj.GetInstance(); } }通常會用到singleton的時機為
1.想要一個global物件可以做資料存取
2.當使用了某些只能被init一次的API
3.當必須確保該物件為唯一
Reference : 深入淺出設計模式
沒有留言:
張貼留言