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

2021-08-08 04:38:41 字數 3642 閱讀 8178

一、概念

工廠設計模式也是日常開發中常用的設計模式之一。首先我們先來搞清楚什麼是工廠設計模式,我們為什麼要使用這種模式。

工廠模式主要是為建立物件提供過渡介面,以便將建立物件的具體過程遮蔽隔離起來,達到降低耦合提高靈活性的目的。

舉個例子:我們去買車,車就是乙個物件,沒有工廠的話,我們就需要自己製造一輛車,也就是new乙個物件;但是製造車的過程很複雜,自己製造很麻煩;所以有了工廠,工廠幫我們製造好車,我們只需要對銷售員說:我要一輛車。銷售員就給了我們一輛車。

二、分類

工廠模式分為3類:

1.簡單工廠模式(****** factory)

2.工廠方法模式(factory method)

3.抽象工廠模式(abstract factory)

gof在《設計模式》一書中將工廠模式分為兩類:工廠方法模式(factory method)與抽象工廠模式(abstract factory)。將簡單工廠模式(****** factory)看為工廠方法模式的一種特例,兩者歸為一類。

1.工廠方法模式:

乙個抽象產品類,可以派生出多個具體產品類。

乙個抽象工廠類,可以派生出多個具體工廠類。

每個具體工廠類只能建立乙個具體產品類的例項。

2.抽象工廠模式:

多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。

乙個抽象工廠類,可以派生出多個具體工廠類。

每個具體工廠類可以建立多個具體產品類的例項。

區別:

1.工廠方法模式只有乙個抽象產品類,而抽象工廠模式有多個。

2.工廠方法模式的具體工廠類只能建立乙個具體產品類的例項,而抽象工廠模式可以建立多個。

三、簡單工廠模式

首先需要乙個奧迪q車系的介面:

abstract class audiq 

}

然後是我們的具體車系也就是產品類:

public

class

audiq5

extends

audiq

}

public

class

audiq7

extends

audiq

}

車系定義好了,那麼還需要有乙個工廠類來生產:

public

class factory

return

null;

}}

這樣乙個簡單工廠方法就設計好了,當我們需要什麼車系直接跟工廠要就可以了:

factory factory = new factory();

audiq5 audiq = (audiq5) factory.createaudiq(5);

audiq7 q7 = (audiq7) new factory().createaudiq(7);

簡單工廠模式又稱靜態工廠方法模式。它存在的目的很簡單:定義乙個用於建立物件的介面。

它有3個組成部分:

1.抽象產品角色:它一般是具體產品繼承的父類或者實現的介面。

2.具體產品角色:工廠類所建立的物件就是此角色的例項,由乙個具體類實現。

3.工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯,用來建立產品。

這種工廠模式有乙個很明顯的缺點
:每增加一種車型時,都要新建乙個具體產品類,並在工廠類中增加相應的建立業務邏輯,這顯然是違背開閉原則的。

於是就出現了優化版,工廠方法模式:它將工廠類定義成了介面,每新增車型,就增加該車種型別對工廠類的實現,這樣工廠的設計就可以擴充套件了,而不必去修改原來的**。

四、工廠方法模式

工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類繼承。這樣在簡單工廠模式裡集中在工廠方法上的壓力可以由工廠方法模式裡不同的工廠子類來分擔。

下面繼續用上面的例子來介紹工廠方法模式

首先奧迪q車系的介面還是一樣:

abstract class audiq 

}

然後是我們的具體車系也就是產品類:

public

class

audiq5

extends

audiq

}

public

class

audiq7

extends

audiq

}

工廠類這裡我們用乙個介面實現:

inte***ce

factoryaudiq

具體的車系工廠:

public

class

factoryaudiq5

implements

factoryaudiq

}

public

class

factoryaudiq7

implements

factoryaudiq

}

這樣乙個工廠方法模式也設計好了,最後就是使用:

factoryaudiq5 factoryaudiq5 = new factoryaudiq5();

audiq5 audiq5 = (audiq5) factoryaudiq5.createaudiq();

audiq7 audiq7 = (audiq7) new factoryaudiq7().createaudiq()

工廠方法模式組成:

1.抽象產品角色:它是具體產品繼承的父類或者是實現的介面。

2.具體產品角色:具體工廠角色所建立的物件就是此角色的例項。

3.抽象工廠角色: 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。

4.具體工廠角色:它含有和具體業務邏輯有關的**。由應用程式呼叫以建立對應的具體產品。

總結一下:

工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的工廠類。這樣便分擔了物件承受的壓力;而且這樣使得結構變得靈活起來——當有新的產品產生時,只要按照抽象產品角色、抽象工廠角色提供的合同來生成,那麼就可以被客戶使用,而不必去修改任何已有的**。可以看出工廠角色的結構也是符合開閉原則的!

缺點:當產品種類非常多時,需要大量的與之對應的工廠物件。

今天先寫到這裡,下篇我在寫工廠設計模式的第3種模式:抽象工廠模式。

設計模式 1 工廠模式

本篇部落格主要是總結一下自己對工廠模式的認識,例子可能不太恰當,uml類圖也可能線用錯。不過思想還是正確的 望各位指出錯誤 簡單工廠模式嚴格意義上不屬於設計模式 2.1 抽象產品角色 是具體產品角色的共同父類,提供了乙個標準介面。e.g 將計算機專業看成乙個抽象產品角色 public abstrac...

設計模式 工廠模式 1

2.工廠方法模式 3.抽象工廠模式 public inte ce fruit public class banana implements fruit public class implements fruit public class fruitfactory public static frui...

設計模式 1 工廠模式

介面行模式 職責型模式 構造型模式 不通過類建構函式來建立物件,使用特定的模式來為客戶類建立例項物件 操作型模式 擴充套件型模式 在建立類時,通常可以同時定義多個建構函式來建立這個類的例項。然而有些時候,客戶 雖然需要某個物件,但是卻不關心這個物件究竟是由哪個類建立而來。工廠模式的意圖是定義乙個用於...