以下是範例
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 : 深入淺出設計模式
沒有留言:
張貼留言