[設計模式] 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