先看一下目錄結構
再說一下大致的邏輯,首先建立乙個起始介面,iuser,之後出現乙個使用者需要去實現這個使用者介面,按照以往的建立邏輯,每次乙個使用者進行一次new,工廠意味著自己不需要去在乎他的建立邏輯,不需要知道怎麼建立,只需要給定乙個約束值,通過這個約束值我就知道如何去建立自己想要的某個物件,讓使用者只在乎結果,不必在乎過程。
這裡是專案的結構圖,userwang 實現了iuser介面,從而別的使用者新增進來也是,當這些使用者出現一些共性的時候,只需要新增乙個類去實現這個iuser介面可以做到統一管理。
簡單工廠的用法,看到create(string) 這個string就是乙個約束值,上**:
可以看到裡面是使用了if 進行判斷,當name為wang的時候就知道去建立iuserwithwang 這個物件,當出現 zhang的時候就可能建立iuserwithzhang。
而建立只需要例項化乙個工廠物件,去傳入某個值就可以建立各種你想要的物件,所以這個模式叫工廠,你只需要給材料,我就給你乙個你想要的東西。
但是簡單工廠有乙個不好的地方,我需要乙個新的物件,我是不是都要去修改這個if判斷加上各種else if?就違反了開閉原則。
開閉原則:對介面擴充套件開放,對修改關閉。即:只能擴充套件不能修改。
當然可以說,可以傳入class啊,傳入完整包名啊,進行乙個反射建立例項,但是還是需要傳參,如果任意傳參錯誤了怎麼辦?
先上結構圖
可以看到多出乙個 工廠介面,上關係圖。
工廠方法,實現了單一職責、開閉原則,但是不好擴充套件。
可以從圖裡面看出大概意思**,乙個工廠只做一件事**,我wang工廠我就只建立wang這個使用者,那麼我出現乙個zhang,出現乙個liu等等多個使用者,我都要建立乙個工廠乙個使用者類,會產生很多類。
工廠方法:讓子類去決定建立哪乙個物件。
看一下**:
iuser和userwang **內容不變。
wang這個工廠實現了使用者工廠,我這個wang工廠我只建立wang使用者,你要別的使用者,那麼麻煩你去別的工廠,這樣就實現了開閉原則。我不管你要什麼,我這個工廠只建立我想建立的。
就避免了if…else…
指定某乙個工廠進行建立某乙個物件。
先上結構圖
關係圖可以看出乙個工廠現在可以建立多個產品了,當再出現乙個產品如果是乙個系列的只需要在iuse***ctory中再新增乙個建立的對應產品的抽象,之後再新增乙個對應的產品抽象和產品實現。
這樣的擴充套件性非常高,但是違背了開閉原則?為什麼呢?
仔細想一想,如果我現在已經有很多任務廠了,不同的工廠生產一系列的產品,但是突然我需要給這個抽象工廠新增乙個產品?會出現什麼情況? 我之前的所有工廠,全部都需要去建立這麼乙個產品,所有工廠的**都需要修改。
所以以上三種工廠模式屬於建立型設計模式,但是各有優劣具體的設計模式需要在業務中視情況而定。
簡單工廠 工廠方法 抽象工廠的區別
定義乙個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態 static 方法,因此簡單工廠模式又被稱為靜態工廠方法 優點 簡單易於實現,把類的例項化交給工廠,易於解耦。缺點 違反了ocp開閉原則。案例 jdk日期格式化dat...
簡單工廠,工廠方法,抽象工廠
簡單工廠,工廠方法,抽象工廠都屬於設計模式中的建立型模式。其主要功能都是幫助我們把物件的例項化部分抽取了出來,優化了系統的架構,並且增強了系統的擴充套件性。本文是本人對這三種模式學習後的乙個小結以及對他們之間的區別的理解。簡單工廠 簡單工廠模式的工廠類一般是使用靜態方法,通過接收的引數的不同來返回不...
簡單工廠 工廠方法 抽象工廠
簡單工廠 乙個工廠類 根據傳入的參量決定建立出哪一種產品類的例項 直接乙個工廠類,內部通過 swith operator add類實現該介面 adddao implements dao dao的實現類 客戶端 dao dao new adddao dao.createoper 產生物件 這樣如果需要...