[設計模式] Singleton Pattern (單例模式) Part1

最近在學習Hibernate的時候,發現在原廠的Documentation裡面,使用了Singleton Pattern這樣的模式,就讓我藉由這篇文章複習一下Design Pattern吧。

設計模式在軟體開發中,指的是如何運用一個良好的思維邏輯來進行程式碼架構的規劃及撰寫。提到設計模式,一定會提到Gof等四位作者所撰寫的這本書吧:


今天想要介紹並且讓我自己複習的正是Singleton Pattern(單例模式)。Singleton Pattern在設計上是希望確保一個類別在系統運行的時候,只有一個實體(instance)產生,同時,這個類別必須要提供一個公開的方法讓其他人取得自己的實體。為什麼我們要使用者這個模式?

在某些情況下,你的程式只會希望有一個物件的實體存在,比如說,連接資料庫的物件、程式管理員的物件、處理印表機列印的類別等等。如果這些物件可以有多個實體,那每次需要這些功能的時候,我們都可以任意的new一個實體出來進行操作,這樣會造成相當恐怖的結果。

如果把Singleton Pattern實作出來,長相會是這樣


public class Singleton {

    private static Singleton instance;

    private Singleton () { }

    public static Singleton getInstance() {
      if(instance==null)
        instance = new Singleton();
      return instance;
    }
}

這段程式碼的重點有三個:

  1. 要有一個私有(private)的靜態(static)方法:用來紀錄類別的實體。因為是私有的,所以外部沒辦法直接透過Singleton.instance來存取。
  2. 類別擁有一個私有的建構子:其他的方法沒辦法直接產生這個類別的實體,說的白話一點,就是不能夠用new Singleton()這樣的方式來產生實體,這是重點所在。
  3. 擁有一個公開取得物件實體的方法:由於是私有建構子(private constructor)的原因,要產生這個類別的實體,只能靠自己類別內的方法產生。但是又必須要讓外部能夠呼叫,所以要設定為公開的靜態方法
這種方式又稱為【Lazy Instantization】,中文可以翻作【延遲實體化】。為什麼呢?因為我們可以看到,我們只有需要這個物件的時候,利用Singleton.getInstance()這樣的方法來取得Singleton這個類別的實體,不需要的時候就不會產生,所以叫做延遲的實體化方法。

要怎麼驗證呢?很簡單,寫一個小程式測試一下就好了,兩個實體的hashcode應該是相同的囉:

Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1.hashCode());
System.out.println(instance2.hashCode());

Lazy Instantization的方法在Single Thread的程式中是可以正確運作的,但是當你的程式有兩個或兩個以上的threads在跑的時候,就會出現問題,這個部份我們留到part2再談囉!

Google試算表的好用公式分享

當我們電腦沒有安裝Office的時候,Google文件是個不錯的工具,甚至有些人連Office都不裝,直接在網路上使用這套簡單好用的辦公室軟體。

今天要跟大家分享幾個在Google試算表中好用的公式。

  • 顯示圖片
  • 公式:Image("URL", parameter)
  • 使用說明:在Google試算表中,如果你的某個cell是一張圖片的連結,你可以在另一個cell中使用Image()這個公式來顯示圖片。比如說像下圖,在A2這一個cell中是圖片的連結,那我在B2這個Cell就可以用【=Image(A2,3)】這樣的公式來顯示圖片,結果就像下圖一樣。



而Image()這個方法可以給兩個參數,第一個參數放圖片的網址,第二個參數可以分別是1,2,3或4,分別代表不同的插入方式。

  • 1 是代表插入的圖片會剛好fit儲存格的大小。
  • 2 代表它會符合儲存格的寬度。
  • 3 則是會顯示原始的圖片尺寸。
  • 4 的則代表你可以自訂圖片的長寬。如果你使用4這個參數,就要在Image公式中指定,比如說【=Image("URL",4,600,400)】,代表插入一張600*400的圖片囉!



  • 翻譯文字
  • 公式GoogleTranslate("文字","文字語言","想要翻成的語言")
  • 使用說明:如果你把文字放在某個儲存格中,公式就如下圖所示。像這個例子中,我嚐試把日文翻成繁體中文:



比較麻煩的反而是去記憶不同語言的參數是什麼。在這裡我列出幾個比較常用的語系:

  • 英文:en
  • 日文:ja
  • 韓文:ko
  • 法文:fr
  • 德文:de
  • 西班牙文:es
  • 繁體中文:zh-tw
  • 簡體中文:zh-cn
你也可以參考Google Translate的API,裡面有列出目前支援的語系:Google Translate語系支援表

  • 日期函數
  • 今天日期
  • 公式TODAY()
  • 使用說明:顯示今天的日期。



  • 日期差
  • 公式:DAYS360("日期一","日期二")
  • 使用說明:DAYS360公式可以傳回兩個日期之間的差距。使用的方法也很簡單,參考下圖:


當然Google試算表支援的公式不只這些,其他的部分就請大家自行參考【相關閱讀】中的連結囉!如果大家有用過很好用的公式,也歡迎留言分享:)

【相關閱讀】
Google試算表公式列表

YouTube Trends - 不僅僅是比較觀賞數的Youtube趨勢網站

Youtube在今天推出了Youtube Trends的網站服務,從名稱上可以知道,它是提供使用者觀察目前在Youtube上的影片趨勢。網站的連結如下:


該網站總共分成幾個區塊,分別是:

  • Trending Topics
Trending Topics是Google針對影片的metadata(包括標題、敘述內容、關鍵字)等等的資訊,來萃取出目前共同的流行話題。


  • Trending Videos
Trending Videos則是單純的根據影片的瀏覽數來抓出最熱門的影片。


  • Dashboard
在Dashboard的部份則根據地區、年齡和性別等不同的面向來呈現影片觀賞的趨勢。


你可以根據地區、年齡等條件來檢視該條件下的熱門影片:


同時可以針對最多三種條件來比較,比如說下圖我比較了亞洲地區的台灣、南韓和日本等三個國家,25-34歲之間的人所觀看的Youtube影片:



更方便的是,你可以勾選【Unique】或【Common】來highlight出共同或特有的影片,方便你快速比較:

  • 4 at 4
這是在最上方的一個區塊。每天早上和下午四點的時候,YouTube會去發掘四個被使用者大量瀏覽或分享的影片。



  • Blog
在部落格的部分則是提供內容。


Youtube Trends的目標不是單純的顯示最熱門影片或影片的點擊率等等表面上的資訊,更重要的是他想要做到【跨文化】之間的比較。比如說之前有一篇是在探討貓和狗在美國哪一個比較受到歡迎的文章。事實上就已經挑選出特定的【有意義可比較實體】來比較。


如果大家有興趣,不妨來玩玩看Youtube最新提供的服務,看看能不能找出更有趣的東西出來:)

【相關閱讀】
About YouTube Trends

CRUD (Create, Read, Update, Delete) - 對於資料庫操作的四大基本功能

CRUD 在Computer Science的領域中通常指的是對於資料庫操作的四大基本功能。而對應的SQL操作則分別是INSERT、SELECT、UPDATE和DELETE:



  • Create (INSERT)
  • Read (SELECT)
  • Update (UPDATE)
  • Delete (DELETE)




Chrome Web Store - Google 打造網路應用程式商店

Google 在今天推出了Chrome Web Store的網路應用程式服務網站,包含了許多免費或付費的網路應用服務(Apps)、套件(Extensions)和佈景主題(Themes)


簡單從字面上來看,Chrome Web Store就像一個商店,這個商店中有許多的商品,而在Chrome Web Store上,商品就是網路應用服務(Apps)、套件(Extensions)和佈景主題(Themes)等三大類。

如果你還是不了解,沒關係,先連結過去看看吧!在這裡要特別注意的是,目前Chrome Web Store上所推出的服務都只能用Google Chrome來存取,如果你是用其他的瀏覽器,連結過去後會出現這樣的訊息:


所以請大家可能要先安裝一下Google Chrome瀏覽器了。



  • 特別提醒

如果你有使用分頁套件,比如說Speed Dial之類的Extension,請先停用或移除,不然之後在啟動App的時候會有問題喔!謝謝讀者的留言提醒:)

在下載的時候,不妨也可以看看Google官方所上傳的影片:

  • What is Web App?



  • 到底什麼是網路應用服務(Web Apps)?

其實說穿了,本質上他就是個網站,只是傳統的網站,包含的是圖片和文字,一般使用者可能只是單純的進行閱讀及瀏覽;而網路應用服務使用了其他的技術,讓這個網站具有互動的效果,你可以透過瀏覽器,存取這些網站(Apps),效果就好像你在作業系統中安裝的一些軟體一樣。換言之,透過瀏覽器,你可以編輯圖片、玩遊戲、進行文書編輯...等工作。

如果現在還是覺得疑惑,不妨先實際用用看吧!用Google Chrome連到Chrome Web Store之後,會看到這樣的頁面:


左邊的部份包含了Chrome Web Store的三個主要產品:Apps、Extensions和Themes:


右邊的部份則是最熱門的付費Apps和Google推薦的Apps:


要安裝一個App相當簡單,任意點選一個你喜歡的應用服務,進入之後會看到Install的按鈕,點選之後就會進行安裝了:


安裝完成之後,Google Chrome會開啟一個新的分頁,裡面會顯示目前你所安裝的所有應用程式,點選剛剛安裝的應用程式(在這裡示範的是Picnik)就可以使用了::



之後想要檢視自己安裝的應用程式,就開啟一個新分頁就可以囉!


  • 如何移除應用程式?


要移除應用程式也很簡單,只要把滑鼠移動到該應用程式的按鈕上,右上角會出現一個小圖示,滑鼠移過去之後會出現選單,裡面就可以直接進行移除囉!


至於擴充套件(Extensions)和佈景主題(Themes)這兩樣本來就存在的功能就不再多加介紹了。大家可以看看Google所提供的影片:

  • What is an extension?



  • Google Chrome Artist Themes.



Google這次透過Chrome Web Store,打造了一個整合平台,同時把免費和付費的應用服務整合進來。需要付費的應用服務透過Google Checkout,先把自己的信用卡登錄進去後,付費的過程相當的快速。


當然,Chrome Web Store不可免俗的一定會和Apple Store相互比較,而Google是不是想要和其一拼,我覺得很值得仔細觀察。Google當然沒有忘記自己的Chrome OS計畫,搭配小筆電出貨,內建Chrome的瀏覽器後,自然而然的就變成一個低成本、高效率的行動工作平台。甚至把自家的Android系統整合進來,未來在手機上也可以很方便的存取這些服務,以Google強大的平台打造能力,我想這些都是可以想像的,未來就看Google要怎麼來玩了,總之,把這個平台做大,讓開發者在這上面可以很容易的進行服務的流通,必定是一個很有潛力的道路。對於一般使用者來說,我們只要期待有更多有趣好用的服務,以免費或更便宜的價錢提供出來,不就是最棒的事情了嗎?

「相關閱讀」
Chrome Web Store 詳解!與Google應用程式商店原生免費Apps
Chrome Web Store上線 Mozilla明年可能跟進

Streamdrag - 讓Youtube變成你的專屬音樂DJ

Streamdrag是一個美觀好用的Youtube線上播放服務,它提供了一個簡單操作的介面,讓你可以很輕易的將Youtube上的影片加入到自己專屬的播放清單。

服務名稱:Streamdrag

剛登入到這個服務時,建議先進行註冊,這樣才可以建立自己專屬的播放清單。註冊完畢登入後,會看到簡潔美觀的畫面:


中間的部份是Streamdrag推薦的播放清單,如果要自己建立一個專屬的音樂播放清單時,可以點選畫面上方的Create Playlist連結:


你可以用搜尋的方式來尋找自己喜愛的音樂影片,Streamdrag也支援中文的關鍵字,所以可以直接輸入歌手姓名或歌名!比如說在這裡我輸入了張惠妹,按下搜尋之後就會跑出對應的結果:


按下箭號就會直接播放,如果想要加入到播放清單點選+號就可以了。


建立好播放清單後,按下【Play playlist】就會自動播放清單內的影片了:


在Streamdrag中,播放清單是可以選擇公開(Public)或是私人(Private)的形式,登入之後點選上上方的【My Playlist】或是直接選擇這個連結:http://streamdrag.com/Profile/MyPlaylists,會看到自己所建立的播放清單,在這裡你可以將播放清單的權限作設定:


你也可以分享某個播放清單到你的Facebook或Twitter上:

某一支影片在播放時,當然也可以進行分享,在播放器的下方就會看到分享的按鈕:


Streamdrag提供了美觀簡單的使用介面,讓你可以輕鬆的連續播放Youtube上的影片,同時你要進行分享也很容易,推薦大家用用看囉!

利用RSS訂閱Flickr照片,精彩的照片決不錯過

Flickr這個照片分享服務相信就不用再多加著墨介紹了,相信大家都用過或聽過這個照片分享的服務網站。每天在Flickr上有數以千計的好照片被分享出來。有沒有好方法可以一定瀏覽大量的照片而不需要登入後一張一張的開啟呢?

在這裡我要介紹幾個利用RSS訂閱Flickr照片的方法,如此一來你就可以用自己習慣的RSS閱讀器來觀賞來自全世界的美麗照片啦!

Daily interestingness Flickr photo RSS feeds



Flickr RSS Feed Generator
  • Flickr RSS Feed Generator:Flickr RSS Feed Generator讓你用【tag】來產生相對應的RSS訂閱。你只需要在tags的輸入框中填入想要訂閱的標籤就可以了。

下面就是我利用【taiwan bluesky】標籤找出的Flickr照片:


digestr: a flickr utility for digesting flickr photos

  • digestr:這個服務可以說是強化版的Flickr RSS訂閱服務。digestr可以讓你以【標籤】、【群組】、【使用者】或【關鍵字】來進行搜尋。

直接訂閱某人的Flickr RSS

  • 這應該是最直接的方式了,如果你對某個Flickr使用者所上傳的照片特別有興趣時,可以在該使用者的專屬頁面下方找到訂閱XXX的照片,直接加到你習慣的RSS閱讀器中吧!



如果你厭倦了Flickr的瀏覽方式或是不想要一直到Flickr的網站上點選照片,不妨試試看用RSS訂閱的方式囉!

【相關閱讀】
4 Unique Tools to Monitor Flickr via RSS

minus - 超好用的拖曳分享圖片服務!

很多時候,我們會想要分享照片或有趣的圖片給朋友,這個時候,你可能第一時間會想到像是Picasa或Flickr這樣的照片分享服務。沒錯,這些服務的確很好,但是如果我們只是想要進行暫時的分享時,有沒有更快的方法呢?還要登入到Picasa或Flickr,就會顯得有顯麻煩,這個時候就來試試看【minus】這個超級簡單好用的圖片分享服務!

  • 名稱:minus
  • 網址:http://min.us/
  • 限制:單一相簿不得超過50張圖片、單張圖片不得大於7MB

minus的頁面就是這樣簡單,中間的訊息提示使用者【將圖片拖曳進這個頁面】,就這樣,沒了!


因此,你需要作的也就是這樣,選定好你想要分享的圖片,拖曳到minus的頁面


當上傳成功之後,會看到一張張剛剛所選擇的圖片以及一個小視窗:


旁邊的小方框顯示這次分享的資訊,你可以修改這個相簿的名稱,也可以選擇要刪除圖片。如果想要分享給朋友時,只要把下方的【Share】連結複製給朋友就可以囉!而Edit的頁面和Share的頁面都是一樣的,差別只有Edit頁面可以進行名稱的修改和照片的刪除,Share的頁面只能瀏覽圖片:


這個就是在Share頁面時的狀態,少了可以編輯的部分囉:


每一張圖片下方都會有自己的連結,如果只想要分享單一張照片時可以用這個連結:


在瀏覽照片時可以用滑鼠點選或是使用鍵盤的向左向右方向鍵,還蠻方便的。

大致上的功能就是這樣,不需要進行登入的動作就可以分享了!當然minus也提供了使用者註冊和登入的服務,在右下角有Login的選項,點選之後就可以進行註冊的動作。而註冊和匿名分享最大的差別在於,當你用帳號登入進行圖片上傳時,minus會紀錄你個人的分享情況,你隨時可以用右下角的【My Galleries】按鈕來瀏覽過去分享過的圖片:


如果你是用匿名的分享,minus也會嘗試去記錄,不過變成使用【cookies】的方式,也就是變成以每台電腦當成一個使用者,如果你是在公用電腦上進行分享時,安全性和隱私性就比較低囉!

minus是一個相當簡單、好用的圖片分享網站,在分享時只需要進行拖曳的動作,的確是再方便不過了。不過他也有一些限制,像是單一相簿的圖片數量不能超過50張單張圖片的大小不得大於7MB,儘管如此,但他的方便和快速分享依舊讓人印象深刻,如果你有經常需要分享圖片的需求時,不妨試試看minus,保證會讓你驚艷不已喔!

QTTabBar 讓你的檔案總管也有分頁功能

當你在Windows裡面想要進行當按複製的時候,一定會遇到必須在不同的視窗中進行切換的情況,如果只是鄰近的資料夾倒還好,但是當資料夾的階層很複雜,或是想要操作的檔案數量一多,這樣切換的動作就變得很惱人且不方便,如果要開啟多個視窗,那更是會讓畫面雜亂無章。

QTTabBar是一個可以幫你在檔案總管產生分頁的小外掛,安裝之後,在Windows的檔案總管中,就可以像瀏覽器一樣產生分頁,如此一來,就可以把眾多的視窗用分頁的形式表達,整合在一個畫面中,操作起來就會比較順手了。


下載安裝完成之後,第一件事情就讓我們在Windows的檔案總管中將它啟動。在工具列中的【檢視】選項,選擇【工具列】後,會看到QT TabBar的選項,點選將它啟動:


啟動之後,在QT TabBar的任何地方按右鍵會出現選單,我們選擇【Option】,進去設定語系:


在【General】的選項內會看到【Language File】的選項,在這裡我們選擇剛剛下載回來的中文化語系檔,就可以把英文的介面改成中文了!



一般的使用下,可以將資料夾或磁碟機拖曳到QT TabBar上,就會出現對應的路徑分頁:


除了最基本的用分頁來顯示資料夾外,還有幾個相當好用的功能,包括:

  • 群組化分頁:群組可以包含一系列你想要放在一起的資料夾,你可以在【選擇】中的【群組】選項中作設定,按下【+】這個選單把資料夾或磁碟機加入:


在這裡有個小技巧(或是說這是QT TabBar的小Bug),如果你想要加入自訂的資料夾,QT TabBar預設沒有辦法加入一個空資料夾讓你自己選擇要加入的群組內容,但是我們可以選擇下方有一個【+】的符號,加入它預設的選項之後再進行【更改名稱】及【加入資料夾】的動作。

比如說我想要建立一個叫做【音樂】的群組,我可以先隨便加入一個資料夾,假設是【我的文件】:


加入之後,會出現【我的文件】的群組和對應的資料夾,接著你可以選擇資料夾,按下右上方的【-】將其移除,並且在群組的選項上按【F2】進行更改名稱的動作(在這裡我改成音樂):


然後你就會得到【音樂】的群組,接著選擇右上角的【+】,加入自己想要的資料夾就可以了。此外,你還可以針對每個群組設定快速鍵。選擇群組,點選下方的【快速鍵】選項後,按下自訂的快速鍵就可以了:



在設定好群組之後,就可以在QT TabBar上按右鍵選擇群組,並且啟動對應的資料夾了:


QT TabBar可以設定的選項相當多,比如說你可以設定【在標籤上連續點滑鼠兩下】的對應行為,或是用滾輪點選時的對應行為:


即時預覽圖片:當你把滑鼠游標停在圖片檔時,可以看到該圖的預覽:


即時資料夾顯示:點選資料夾後,會出現一個【向下的箭頭】,點選之後就可以直接瀏覽內部的檔案或資料夾了:


此外,QT TabBar還提供了【鎖定分頁】、【瀏覽最近關閉分頁】、【復原關閉分頁】等等的相關功能,都相當實用,就好像你真的在用瀏覽器瀏覽網頁一樣,只是現在從瀏覽器換成了檔案總管罷了:


除了上述的功能之外,QT TabBar還可以自訂標籤的顏色、設定應用程式快速鍵、甚至安裝外掛模組,這一部份大家可以自己玩玩看,相信應該會得到很多驚喜的效果。整體來看,QT TabBar和Windows的檔案總管整合的相當不錯,使用起來也不會造成電腦系統的負擔,裝了之後就好像Windows本來就提供這樣的功能,也可以有效的讓電腦不要出現過多的視窗,在這裡推薦給大家使用。