《head first》設計模式之四 工廠模式

2021-08-15 09:26:43 字數 2055 閱讀 9515

工廠模式一章講了很多內容,但是設計思想是一致的

1:變數不可以持有具體類的引用(如果使用new 就會持有具體類的引用,可以用工廠類避開)

2:不要讓類派生自具體類(如果派生自具體類,那就是依賴具體的實現類,彈性差,請派生自抽象類或者介面)

3:不要覆蓋基類中已實現的方法(如果覆蓋基類已實現的方法,那基類就不是乙個真正適合被繼承的抽象,基類中已經實現的方法,應該有所有的子類共享)

本章的工廠模式也是基於上面的思想,分別出現了簡單工廠方法(更像是程式設計習慣,不是我們定義的工廠模式),工廠模式,抽象工廠模式;

工廠模式引用的例子是pizza store的例子,我們在pizza store裡面可以生產各種各樣的pizza,如果我們在pizzastore類裡面直接new pizza()物件的話,那如果每次更改選單,推出新的口味的時候,都要更改pizzastore類,跟我們想要的不一樣,更何況,pizza store可以有加盟店,中國的pizza store和美國的pizza store可以有不同的pizza,那我們更難修改了。

工廠方法的定義:定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。

簡單工廠方法,工廠模式,抽象工廠模式的區別

原始的類   

class pizzastore

if(口味==榴蓮)

if(口味==雞肉)

throw new exception("麵糰給你,你來做");

}}

我們一開始的pizza store是上面這種,但是不久就被客戶投訴口味太少(服務態度太差).需要整改,我們可以做一些牛肉口味、烤肉口味、水果口味的pizza,那我們修改一下pizzastore的createpizza方法,下次我們發現榴蓮pizza沒人喜歡,我們要撤掉,那還要再修改pizzastore,更要命的來了,福蘭人民很喜歡吃pizza。要加盟我們的pizzastore,但是我們的pizza口味都太淡了,不夠辣,要加辣,加**辣。這個時候我們要怎麼辦呢。

簡單工廠方法:

我們會定義乙個類來專門生產pizza

class pizzafactory

if(){}

if(){}

}}

class pizzastore

}

那我們就可以只修改這裡面的方法,不用修改pizzstore的類物件,那麼我們pizzastore就可以保持穩定,畢竟我們要對修改關閉。有乙個專門的類負責維護new pizza();

工廠模式:定義乙個抽象類,讓子類來具體實現具體例項化哪個類

abstract pizzafactory
class 廣州的pizzafacatory extends pizzafactory()

if(){}

if(){}

}}

class 福蘭的pizzafactory extends pizzafactory();

if();

if();

}}

我們的廣州和福蘭的pizzastore就不用改變自己,只要依賴不同的pizzafactory就好了;而且,我們還可以把pizzastore裡面的收銀方法設定成final,強制全國內的pizzastore收銀全部進入公司統一賬戶。

抽象工廠模式:

pizzastore越開越多,公司也越來越大,但是顧客投訴,在山東吃的pizza乙個兩斤,在上海吃變成了一斤八兩,小了二兩吃不飽,公司檢視原因,發現上海的pizzastore的原料**商擅自把麵餅調小了一部分,公司決定統一pizza的尺寸,重量,甚至用料,統一由乙個原料生產商提供,而不是pizzastore自己採購,這樣就做到全國統一標準。

class inte***ce 原料factory()
然後招投標了一家公司,合理的**生產我們的原料。實現了統一標準,這個時候我們用到的介面和生產了乙個產品組就是我們的抽象工廠模式,

其實我們看到,簡單工廠方法,工廠模式,抽象工廠模式之間差別還是很大的,也是因為我們的pizzastore一步一步發展起來不斷改良的結果。

Head First設計模式四 工廠模式

除了使用new操作符之外,還有更多製造物件的方法,比如使用工廠模式封裝例項化的行為。工廠模式在輔助面向介面程式設計時很有作用,它用來封裝物件的建立。本章從簡單工廠開始講起,並逐步深入了解工廠方法 factory method 和抽象工廠模式 abstract factory 從嚴格意義上來說簡單工廠...

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...

《Head First設計模式》之命令模式

命令模式就是將方法呼叫 method invocation 封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景 記錄日誌或者重複使用這些封裝來實現撤銷 undo 我對...