設計模式 工廠和原型(清晰明了的對比)

2021-04-12 22:02:14 字數 1540 閱讀 6320

1:工廠(factory method)

首先,工廠這個名字取得很好,就像前面說的,建立型模式的意義在於把生成乙個變數從手工作坊(new,delete)的方式變化到工業化的模式,那麼這裡的工業化模式最典型的就是工廠(factory method)。工廠自己也是乙個類,也會生成例項,工廠的功能就是為了建立另外一些變數。舉例子,我們有賓士車,寶馬車,馬拉車等等。現在我們要為他們生成變數,手工作坊和工業化的區別如下:

1)  手工作坊 

mycar = new 賓士。

顯然,如果有一天,你需要了乙個新的車,叫寶馬, 就需要把程式裡面所有的

mycar = new 賓士換成

mycar = new 寶馬。這樣實在太麻煩了。

2) factory方式

首先我們需要乙個factory的例項  factory = new 轎車工廠

那麼我們需要賓士車的時候就是用 mycar = factory.createcar()   //這裡的factory 是賓士車的工廠

我們需要寶馬的時候就用 mycar = factory.createcar()             //這裡的factory 是寶馬的工廠

看,不許要修改那麼多了吧?這個就是factory模式的好處。

3) 缺點。

可惜,factory模式並不能一點都不修改,他需要修改一部分,就是factory自己的建立

當從factory = new 轎車工廠 建立乙個工廠的時候,必須要指定是哪個工廠。比如下面的例子

class 轎車工廠

class 寶馬轎車工廠:public 轎車工廠

class 賓士轎車工廠:public 轎車工廠

那麼,當你想從寶馬車換到本車車的時候,就必須有下面的變遷:

factory = new 寶馬轎車工廠  ==> factory = new 賓士轎車工廠

2: 原型 (prototype)

工廠模式還是有侷限性的,比如轎車,我們需要的轎車可能會越來越多:賓士,寶馬,法拉利,a,b,c,d。。。。。可能有好幾百種。採用工廠模式,我們必須給每一種車輛設計乙個他的工廠,這個會生成好幾百個類!!!!!!!

然而,我們其實並不需要宣告這麼多的類,因為好多任務廠都是類似的。比如上面的幾百個例子中,有幾個這樣的例子:寶馬1型,寶馬2型,寶馬3型,寶馬4型,寶馬5型,寶馬6型。雖然他們的差別很小,但是factory模式必須為他們每乙個生成乙個類!顯然,我們可以用下面的方式來生成幾個類:寶馬原形, 然後 寶馬1型= 寶馬原形(發動機1),寶馬1型= 寶馬原形(發動機2)。。。

這就是原型模式!

原型模式的存在價值就是減少 factory模式的類的種類。

原型模式有以下幾點注意事項:

1) 原型能大大減少類的數目,但是並不會把上面轎車幾百種變成一種,所以我們需要乙個原型管理器。用associative store的方式儲存,可以註冊,刪除,引用乙個原型。這種管理器也可以是乙個擴充套件的singleton物件,這點就有點類似abstract factory了,但是功能不一樣。

2) 轉殖操作。也就是c++裡面的拷貝建構函式。同乙個乙個原型實現乙個新的例項,必須要注意把原型拷貝到新的例項裡面的操作。

PHP設計模式之工廠模式和原型模式

這兩個模式都是針對物件建立和復用的,只是一種設計風格,在建立物件的,隨時都可以改進現有的 畢竟老 很多地方不容易更改了,所以這兩個模式一般適合新加進去,比較容易建立物件或者使用新物件 再者就是。算了 我想說的就是js,把原型做的爐火純青,我一直很痴迷,很多原型都深深的嵌入到語言的核心。推薦那本書 你...

工廠模式和原型方法模式

工廠方法模式 工廠模式方法 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,工廠方法 使乙個類的例項化延遲到其他子類。工廠方法模式實現時,客戶端需要決定例項化哪乙個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單的工廠的內部邏輯判斷移到了客戶端 來實現進行,你想要加功能,本...

自己對設計模式的理解 工廠模式和單例模式

一 工廠模式 個人總結 class factory elseif par 2 else 在另外乙個類中呼叫 class test 二 單利模式 實現單例的條件 三私一公 三私 私有化構造方法 不讓外部建立物件 私有化轉殖方法 不讓外部轉殖物件 私有靜態屬性 儲存已經產生的物件 一公 公共靜態方法 在...