什麼是工廠模式

2021-06-15 21:21:18 字數 3079 閱讀 7736

1、傳授設計模式中存在的問題

我個人最近對設計模式中的工廠模式進行了比較深入的學習,通過學習感悟出,現在很多設計模式傳道者,在講述設計模式的過程中存在一些問題,使得設計模式變得很難理解。設計模式本身很抽象,但是這些傳道者在講述的過程中,將乙個抽象的東西講的更抽象,從而使我們望而卻步。有些人在講述的時候,沒有考慮讀者的注意力。比如我在看《c#設計模式》的時候,在講述抽象工廠模式的時候,直接就進入了乙個示例,而且這個例子比較複雜,涉及了比較多的概念、術語,而且還有演算法要處理。但是這些和要講述的核心內容無關,我想要看懂他的示例就要將這個東西都搞懂,就分散了我的注意力。我個人總結,學習設計模式的方法是,首先找到乙個突破口,比如可以先學習構造型模式中簡單的模式,將它理解、熟練應用。通過對

一、兩個模式有乙個深入的認識之後,再學習其它比較複雜一點的模式就容易多了,這是一種迭代的思想在學習中的應用。另外學習任何一種設計模式的過程應該是具體-抽象-再具體這個的乙個過程。這句話的意思是首先通過乙個比較具體一點的例子來幫助理解設計模式,在理解之後將你的理解擴充套件到解決這一類問題,上公升到一定的理論高度。然後就是再到具體,也就是應用設計模式,應用理論解決自己遇到的實際問題。

2、學習工廠模式的預備知識:

首先宣告這些預備知識並不是工廠模式僅僅需要,因為我先講述工廠模式,所以在學習工廠模式之前將這些問題提出。

2.1 upcasting

public

class base

} public class derive:base {}

private void button1_click(object sender, system.eventargs e)

2.2多型

我不敢想象離開了多型後的設計模式是乙個什麼樣子。什麼是多型,我喜歡總結這樣一句話來回答這個問題,「乙個介面,多種實現」。注意這裡的介面不僅僅表示inte***ce關鍵字,是廣義上的介面。在c#中實現介面我們有兩種途徑,一種是借助繼承來實現,一種是借助inte***ce來實現。

3、工廠設計模式理論

3.1概述

工廠模式具體包括了簡單工廠、工廠方法、抽象工廠,它們是按照從簡單到複雜的順序排列的,屬於設計模式中的建立型,其中簡單工廠並不屬於gof的23中模式。但是它是理解其它的工廠模式的乙個很好的基礎,所以很多人在講述設計模式的時候會提到簡單工廠模式。建立型模式關注的是物件的建立,建立型模式將建立物件的過程進行了抽象,也可以理解為將建立物件的過程進行了封裝,作為客戶程式僅僅需要去使用物件,而不再關心建立物件過程中的邏輯。

3.2不使用任何模式

我們現在有這樣的乙個設計,影像家電(videowiring)包括了***、vcd。在基類videowiring中有playvideo方法,子類過載了這個方法。

public abstract class videowiring

***.playvideo();這樣的語句。

private void playvideo()

上面的**可以實現功能但是不好,為什麼呢?類實現了多型,但是我們在呼叫的時候並沒有利用多型。如果我們有很多的影像家電產品,就需要寫很多的類似

private void playvideo()

private void play(videowiring vw)

3.3簡單工廠模式

我們使用簡單工廠對上面的**繼續改進,根據上面的分析我們考慮對物件建立進行近一步的封裝。使用乙個類專門來完成對物件建立的封裝,這個類我們稱為工廠,因為它的作用很單一就生成出乙個個的類。下面是乙個工廠類的示例**:

public class create

return null;

}

}

這樣我們的客戶端**又可以更加有效簡潔了:

注意:在上面的兩段**示例中我們就已經使用了向上轉型。首先注意在create類的factory方法中使用了return new ***();這樣的語句,但是這個函式的返回值卻是videowiring,它***類的基類。所以我們的客戶程式才可以使用videowiring vw=create.factory("***")這樣的語句。這樣客戶程式並不關心建立是如何完成的,以及建立的物件是什麼,我們都可以呼叫基類統一的介面實現他們的功能。使用uml表示如下圖所示:

private void playvideo()

角色說明:

工廠類(creator):根據業務邏輯建立具體產品,由客戶程式直接呼叫。

抽象產品(product):作為具體產品的基類,提供統一的介面,也是工廠類要返回的型別。

具體產品(concrete product):工廠類真正要建立的型別。上圖中僅僅展示了乙個具體產品,有多個產品的時候類似。

下面我們對簡單工廠模式進行總結。使用簡單工廠的好處是:

1、充分利用了多型性不管什麼具體產品都返回抽象產品。

2、充分利用了封裝性,內部產品發生變化時外部使用者不會受到影響。

缺點是:如果增加了新的產品,就必須得修改工廠(factory)。

抽象工廠模式可以向客戶端提供乙個介面,使得客戶端在不必指定產品的具體型別的情況下,建立多個產品族中的產品物件。這就是抽象工廠模式的用意

我們將工廠模式推廣到一般的情況,它的類圖如下所示:

在有名的

ood的設計原則中有乙個叫做黎克特制代換原則

(liskov substitution principle, lsp)

。它的實質也就是講

向上轉型。它的內容是:

任何接收父型別的地方,都應當能夠接收子型別,換句話說

如果使用的是乙個基類的話,那麼一定適用於其子類,而且程式察覺不出基類物件和子類物件的區別。

lsp是繼承復用的基石,只有當派生類可以替換掉基類,軟體的功能不受到影響時,基類才能真正被復用。 

什麼是工廠模式

1.工廠模式具體包括了簡單工廠 工廠方法 抽象工廠,它們是按照從簡單到複雜的順序排列的,屬於設計模式中的建立型,其中簡單工廠並不屬於gof的23中模式。但是它是理解其它的工廠模式的乙個很好的基礎,所以很多人在講述設計模式的時候會提到簡單工廠模式。建立型模式關注的是物件的建立,建立型模式將建立物件的過...

什麼是工廠模式

三種工廠模式的分析以及c 實現 以下是我自己學習設計模式的思考總結。簡單工廠模式 用簡單的話來說,工廠模式是工廠模式簡單的一種,他可以用一些簡單的方法去隱藏物件的細節,一般只需告訴工廠類所需的型別就可以,工廠類會返回你需要的產品類,但你在客戶端看到的只是產品的抽象物件,不需要關心返回是什麼類。客戶端...

什麼是工廠模式 Factory

世界上並沒有完美的程式,但是我們並不因此而沮喪,因為寫程式就是乙個不斷追求完美的過程。意圖提供乙個建立物件的介面,根據需求建立不同的子類物件 類圖 例項 inte ce obj class obj1 implements obj class obj2 implements obj class obj...