開心網外掛程式開發之 Singleton 單件模式應用

2021-09-05 21:36:06 字數 1503 閱讀 3950

經過我們的努力,操作開心花園的各個底層功能我都開發出來了,我把所有的直接操作的功能都封裝成乙個kaixinhelper類,通過這個類我們可以登入開心網,可以獲得開心花園的所有資訊,可以收穫、播種、除草、除蟲、澆水等等,把在所有對開心網直接的操作都集在這裡了。

我們在寫**的時候發現,kaixinhelper是我們整個程式的核心,所有的程式設計都是圍繞它而來,登入模組要用它, 獲取花園資訊的模組要用它,對花園的所有操作也要用到它,但是它又是有狀態的,就是除了登入以外的所有功能,都必須在確定登入好以後能能正常工作,所以kaixinhelper就只能有乙個例項,不然每次用其它功能而去login一下可不是什麼好事,怎麼能保證乙個類只有乙個例項呢?

我們知道所有的類例項化都是通過構造器來,當我們用new 來例項化物件的時候,會訪問構造器裡的**來例項化,為了不讓你碼new 乙個類,我們可以把構造器變為private,這樣這個類就不能被new了,哪我們怎麼例項化這個類呢, private下的**在本類以外都不能實訪問,我們可以讓類裡面例項化這個類嗎、private下的**在本類以內還果可以訪問的

public static 

kaixinhelper instance = null;

public static readonly object sysroot=new object();

public static

kaixinhelper getinstance()}}

return instance;

}

這樣我們在外面只要
this.khelper = kaixinhelper.getinstance();
這樣我們就得到了這個類的例項。而且我們在訪問getinstance的時個判斷過,instance是否為null,所以每次呼叫kaixinhelper.getinstance();都得到的是同乙個例項,所以我們一次login以後,其狀態一直是儲存著的。

為什麼我們還用到lock(sysroot)這一行**呢,

這是為了保證我們在多執行緒的情況下也保證kaixinhelper只有乙個例項。通過lock可以保證同一時間只有乙個執行緒可以進入。

為什麼要判斷兩次if(instance==null)

第一次的主要作用是因為lock的效能開銷比較大,一但類例項化了以後,不用每次getinstance()都要去訪問lock的**。

第二次的原因是,當類還有被例項化的時候,兩個執行緒同時訪問kaixinhelper.getinstance();這樣都都可以通過第一次的if(instance==null) ,由於lock機制的存在,只有乙個執行緒進入了以下**, 另乙個在一旁等著,第乙個進入並執行了以下**,

if(instance==null) {

instance = new

kaixinhelper();

這樣第乙個執行緒就建立了類的例項,等第二個執行緒再進入的時候,instance已經不為null,這樣就防止了第二個執行緒再次建立類的例項。

這就是設計模式中的singleton 單件(建立型模式) ,以上主要是個人的理解,希望不會誤導人家,有不足之處還請批評指正

開心網外掛程式開發之 Singleton 單件模式應用

經過我們的努力,操作開心花園的各個底層功能我都開發出來了,我把所有的直接操作的功能都封裝成乙個kaixinhelper類,通過這個類我們可以登入開心網,可以獲得開心花園的所有資訊,可以收穫 播種 除草 除蟲 澆水等等,把在所有對開心網直接的操作都集在這裡了。我們在寫 的時候發現,kaixinhelp...

開心網之開心餐廳遊戲分析報告

如我的前一篇文章 開心網模式的個人見解 所述,開心網今後的發展道路,乙個方向就是發展成乙個龐大的遊戲基地,現在看來開心網確實在向這個方向邁進。它所開發的遊戲,也從抄襲,簡單,向複雜化縱深發展,有一開始的抄襲之作爭車位,朋友買賣 也有簡單遊戲買房子偷菜,咬人,超級大亨等 而從釣魚開始,開心網的flas...

寫了個開心網的外掛程式,同時學習了些開心網的一些小技巧

最近做blogbus外掛程式廣場專案,閒暇之餘寫了個開心網的搶車位外掛程式,在開心網的程式架構上學到了一些經驗。首先我注意到搶車位這個遊戲停留在頁面上資料是會即時更新的,而第一反映是ajax,然而為了控 務器負載,是不應該不停產生請求的,分析後發現果然沒有反覆請求,而是在第一次訪問頁面的時候,把每個...