C 設計模式《二》工廠模式

2021-07-28 17:02:28 字數 3184 閱讀 3168

單例設計模式的關鍵點

一.私有建構函式

二.宣告靜態單例物件

三.構造單例物件之前要加鎖(lock乙個靜態的object物件,某些語言可以宣告同步執行,其實是乙個目的)

四.需要兩次檢測單例例項是否已經被構造,分別在鎖之前和鎖之後

經典模式之一,其核心功能是根據「需求」生產「產品」,設計模式的核心是解耦嗎?工廠模式就是為了解耦「需求」和「產品」,但是別忘了,工廠模式工廠模式,還有乙個重要元素,就是「工廠」,所以工廠模式的核心思想,就是解耦「需求」「工廠」和「產品」。對於一般初學者get這個技能比學會單例模式要有逼格。無論是炫技也罷,還是真正利用設計模式解耦,都是一種成長不是嗎?總共有三種型別我們分別討論。主要以實際題目為引導。

這是最入門的工廠,以它為代表的最經典表達形式就是switch 語句。我們利用乙個function工廠處理業務。我需要什麼(傳入標識)那麼工廠就要對應的生產什麼。簡單的需求和生產操作。 /*

*以手錶題目為例  

•所有的手錶都有自己的名字;

•所有的手錶都有年月日時分秒(6個屬性),並且可以顯示時間;

•所有的手錶都可以連續打出五次自己的廣告語;

這三個特性是手錶的最基本特性:第一條是每個手錶特有的屬性,第二條是公共屬性。第三條也是特有的品牌屬性。

*/我們分析題目,找出公共屬性並輸出,這就是我們簡單工廠所能實現的。我需要什麼手錶,我就讓watch工廠生產什麼手錶。

class watch

", datetime.now);

}/// /// 預設為石英表

/// 1--電子錶

/// 2--機械表

///

///

public iproduct getwatch()

}}

*iwatch介面是手錶輸出公共屬性的關鍵,在介面中定義showtime() showadvertisement() showname()。並且所有的手錶都得繼承iwatch介面並實現showtime() 

showadvertisement() 

showname()。

*quartz  eletronic mechanical這三個物件分別表示  石英  電子 機械三種手錶且都繼承iwatch介面。

思考問題:

假如為了業務發展擴充套件生產線,我要增加一萬個產品。我們再增加一萬個case判斷,增加一萬個產品物件。但是維護起來相當麻煩。此時簡單工廠已經不能滿足我們的需求。我們引入第二個概念工廠模式。

為了解決簡單工廠生產多個產品的耦合,我們將產品線分化,分成多個子工廠。這樣無論增加多少個產品,我們只需要增加產品和對應的產品工廠,避免之前的雜糅。

*這裡以石英表物件為例子實現demo。

*quartz繼承iwatch基本保持不變,重要的是我們把工廠物件分化,實現需求和產品族的解耦問題。

*quartz物件例項化的時候就會顯示時間,當我們getproduct()繼續執行名字和廣告的顯示。**如下:

class factoryquartz : ifactory

public iproduct getproduct()

}

public class quartz : iwatch

public void showadvertisement()

}public void showname()

public void showtime()

", datetime.now);

}}

inte***ce iwatch

思考問題:

這裡我們解決了需求和產品族的問題。那麼我們遇到需求  品牌(產品結構) 產品族 三者關係將如何做呢。

工廠模式中,乙個工廠生產乙個產品,所有產品派生於同乙個抽象產品(或產品介面);而抽象工廠模式中,乙個工廠生產多個產品,它們是乙個產品族,不同的產品族的產品派生於不同的抽象產品(或產品介面)。

*根據課題內容,這裡我們要考慮品牌因素,也就是產品結構的問題的解決。我們把工廠建立在品牌下,乙個品牌乙個工廠,工廠有多個生產線,生成不同的產品。如**所示:

ifactory 介面新增多個產品function即產品線。createquartz() createeletronic() createmechanical()

class abstractfactorycasio : ifactory

public iproduct getwatch()

public ieletronic createeletronic()

}

*我們輸出產品,首先考慮它具有產品的基本效能,即getwatch()的實現。如題:首先是乙個表,而且是乙個電子錶。

*其次工廠物件實現產品線的生產。然後繼而表現作為卡西歐品牌特性的輸出。即我們的產品。

public class eletronic : iwatch

public void showadvertisement()

}public void showname()

public void showtime()

", datetime.now);

}}

1.在上面的**中,都使用了介面來表達抽象工廠或者抽象產品,那麼可以用抽象類嗎?有何區別?

從功能上說,完全可以,甚至可以用介面來定義行為,用抽象類來抽象屬性。抽象類更加偏向於屬性的抽象,而用介面更加偏向行為的規範與統一。使用介面有更好的可擴充套件性和可維護性,更加靈活實現鬆散耦合,所以程式設計原則中有一條是針對介面程式設計而不是針對類程式設計。(如題還有個功能尚未實現,即手錶的  年 月  日  時  分  秒 這六個屬性就可以利用抽象物件來實現)

2. 到底何時應該用工廠模式

根據具體業務需求。不要認為簡單工廠是用switch case就覺得一無是處,也不要覺得抽象工廠比較高大上就到處套。我們使用設計模式是為了解決問題而不是炫技,所以根據三種工廠模式的特質,以及對未來擴充套件的預期,來確定使用哪種工廠模式。

3.說說你在專案中工廠模式的應用

如題這就是例子,比其他的那種:「扶老奶奶過馬路強多了」。

c 設計模式(二) 工廠模式

說明 工廠模式 factory pattern 是建立型模式,它提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用乙個共同的介面 工廠 來指向新建立的物件。主要解決 主要解決介面選擇的問題。何時使用 我們明確地計畫不同條件下建立不同例項時。如何解決 ...

二 設計模式 工廠模式

一.傳統時以pizza類舉例,乙個抽象類pizza,由幾個pizza實現類實現,主餐廳看看客戶點什麼便生產,但是如果需要增加新的pizza品種,則要增加乙個新的實現類,然後主餐廳裡增加對邏輯的判斷,顯然,違背了開放關閉原則。所以 工廠模式為解決某些需要生產大量一批類的問題 二.簡單工廠模式 定義了乙...

設計模式(二)工廠模式

與 模式不同,生產模式隱藏過程,只關注結果 簡單工廠,工廠方法,抽象工廠 一,簡單工廠模式 public inte ce car public class aodi implements car public class baoma implements car public class facto...