2013年9月22日 星期日

設計模式 (一) Singleton

Singleton Pattern 就是獨體模式,當需要建立獨一無二的物件時可以使用
以下是範例

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 : 深入淺出設計模式

沒有留言:

張貼留言