如何優雅的建立物件(一)

2021-09-21 13:42:27 字數 1932 閱讀 1408

在建立物件的時候大部分程式設計師都是直接用new的形式。下面來講解另乙個建立物件的方式,用靜態工廠方法代替構造器。

比如我們想得到乙個integer物件,可以直接new得到,也可以用integer.valueof()這個靜態方法直接得到。

int a  =5;

integer b =

newinteger

(a);

integer c = integer.

valueof

(a);

用靜態工廠方法來提供物件,有優勢也有劣勢,可以根據自己的情況選擇。

優勢1靜態工廠方法有名字

在建立物件的時候,往往需要獲取根據引數不同的來獲取不同的例項物件,乙個物件的構造器往往有多個,相信每一位都有被多個構造器弄矇圈的情況,每個構造器的含義需要自己去**裡面看是什麼意思,但是靜態工廠方法可以自定義名字,來通過名字讓我們去呼叫獲取方法的時候能知道是什麼含義

從下面的**中我們可以清楚的從user類的靜態方法名中知道我們獲取的是乙個單例的user例項。

user user = user.

newsingleinstance()

;

不必在每次呼叫它們的時候都建立乙個新物件

如果我們用構造器獲取物件,每次都是獲取的乙個新物件,但是我們通過靜態工廠可以每次獲取的都是同乙個例項,對於有些不可變的例項來說大大加強了效能。

比如下面的integer.valueof方法,在類被載入的時候就已經快取了-128~127的integer例項,當判斷需要建立的例項範圍是在這個中間的時候,就直接返回快取的例項就好了,這樣避免建立大量重複無用的物件。

public

static integer valueof

(int i)

它們可以返回原返回型別的任何子型別的物件

這種設計方法可以隱藏具體的實現,只暴漏公共的介面,根據引數的不同再返回具體的例項物件。這也正式使用者所希望的。對於使用者來說只需要記住這乙個介面就好了,他不用管具體的到底是哪個實現類去實現他。比如我們有個book這個類,這個類下面有好多的類都繼承了book類,對於介面呼叫方來說,我只需要呼叫book這乙個介面就行了,通過傳入的引數,再例項化具體的實現類來完成事情,例如,我要看童話書,呼叫book介面,通過判斷書的種類是童話書,再去實現具體的童話書book類。

它們所返回的物件的類可以隨著每次呼叫而發生變化,這取決於靜態工廠方法的引數值

優勢四其實是優勢的高階版,正因為有了優勢三可以返回任何原始型別的子型別物件,才有了優勢四可以隨著呼叫不同的引數來返回不同的例項化物件。

方法返回的物件所屬的類,在編寫包含該靜態工廠方法的類時可以不存在

比如jdbc連線資料庫,我們在獲取連線物件的時候具體的哪個資料庫的連線物件的類可以沒載入,比如連線物件裡面有好多資料庫的連線物件類,有mysql,oracle,derby等等,這三個資料庫的連線實體類一開始都是不存在的,只有真正的接收具體的連線引數的時候才會有了該具體資料庫的實體連線類

靜態工廠方法的主要缺點在子,類如果不含公有的或者受保護的構造器,就不能被子

類化

例如,要想將collections中的任何便利的實現類子類化, 這是不可能的。但是這樣也許會因禍得福,因為它鼓勵程式設計師使用復合(composition),而不是繼承,這正是不可變型別所需要的 。

程式設計師很難發現它們

當我們對乙個類不了解,但是還需要用的時候,往往想到的第乙個例項化方法就是用構造器來例項化該類,但是對於乙個只提供了靜態工廠方法,而沒有提供構造器的類來說,往往是很難發現如何例項化該類,需要查閱大量的文件和看api說明才可能知道如何去例項化該類,因此遵守標準的命名規範就顯的格外重要了。

如何優雅的入門LISP(一)

其實我不會lisp,以下內容都是我瞎編的 笑話一則 乙個間諜從nasa的主機盜取了乙個用lisp編寫的核心程式,為了證明自己說的是真話,他列印出了程式的最後一頁 lisp程式是由形式 form 排列起來構成的。它通過以下規則進行求值。1 符號 symbol 會被解釋為變數,求出該變數所繫結的值。2 ...

如何優雅的送禮?

送禮的尺度要以法律規定和公司制度為紅線,在職場上,肯定不能送重禮,否則可能成為商業賄賂。很多國際化的公司都有明確的送禮和收禮規定,不能超過幾百元。牢記這一條,你就會發現有創意是多麼的重要,因為你的預算空間實在很小。送禮這件事,從策劃選禮物到對方接收到禮物是乙個操作過程,最重要的是送禮時刻。其實對於有...

C 框架設計 2 更優雅的建立物件

上一章中我們是用以下 來進行物件建立的。這段 並沒有什麼問題,每次新增乙個層的時候在此處新增els if即可。不過還是可以有更優雅一些的實現。layerbase laye ctory string classname 計畫構造一張map對映表,key為類名或者id,value為可返回物件的函式指標。...