JAVA設計模式之抽象工廠模式

2021-08-20 03:06:07 字數 3024 閱讀 1407

本文繼續介紹23種設計模式系列之抽象工廠模式。

前面已經介紹過簡單工廠模式和工廠方法模式,這裡繼續介紹第三種工廠模式-抽象工廠模式,還是以汽車的製造為例。

例子背景:

隨著客戶的要求越來越高,寶馬車需要不同配置的空調和發動機等配件。於是這個工廠開始生產空調和發動機,用來組裝汽車。這時候工廠有兩個系列的產品:空調和發動機。寶馬320系列配置a型號空調和a型號發動機,寶馬230系列配置b型號空調和b型號發動機。

概念:

抽象工廠模式是工廠方法模式的公升級版本,他用來建立一組相關或者相互依賴的物件。比如寶馬320系列使用空調型號a和發動機型號a,而寶馬230系列使用空調型號b和發動機型號b,那麼使用抽象工廠模式,在為320系列生產相關配件時,就無需制定配件的型號,它會自動根據車型生產對應的配件型號a。

當每個抽象產品都有多於乙個的具體子類的時候(空調有型號a和b兩種,發動機也有型號a和b兩種),工廠角色怎麼知道例項化哪乙個子類呢?比如每個抽象產品角色都有兩個具體產品(產品空調有兩個具體產品空調a和空調b)。抽象工廠模式提供兩個具體工廠角色(寶馬320系列工廠和寶馬230系列工廠),分別對應於這兩個具體產品角色,每乙個具體工廠角色只負責某乙個產品角色的例項化。每乙個具體工廠類只負責建立抽象產品的某乙個具體子類的例項。

抽象工廠模式**

產品類:

//發動機以及型號  

public

inte***ce

engine

public

class

enginea

extends

engine

} public

class

enginebextends

engine

} //空調以及型號

public

inte***ce

aircondition

public

class

airconditiona

extends

aircondition

} public

class

airconditionb

extends

aircondition

}

建立工廠類:

//建立工廠的介面  

public

inte***ce

abstractfactory

//為寶馬320系列生產配件

public

class

factorybmw320

implements

abstractfactory

@override

public aircondition createaircondition()

} //寶馬523系列

public

class

factorybmw523

implements

abstractfactory

@override

public aircondition createaircondition()

}

客戶:

public

class customer

}

關於抽象工廠模式與工廠方法模式的區別,這裡就不說了,感覺多看幾遍例子就能理解,還有很多提到的產品族、等級結構等概念,說了反而更難理解。

抽象工廠模式的起源

下面引用一段抽象工廠模式的起源:

抽象工廠模式的起源或者最早的應用,是用於建立分屬於不同作業系統的視窗構建。比如:命令按鍵(button)與文字框(text)都是視窗構建,在unix作業系統的視窗環境和windows作業系統的視窗環境中,這兩個構建有不同的本地實現,它們的細節有所不同。

在每乙個作業系統中,都有乙個視窗構建組成的構建家族。在這裡就是button和text組成的產品族。而每乙個視窗構件都構成自己的等級結構,由乙個抽象角色給出抽象的功能描述,而由具體子類給出不同作業系統下的具體實現。

可以發現在上面的產品類圖中,有兩個產品的等級結構,分別是button等級結構和text等級結構。同時有兩個產品族,也就是unix產品族和windows產品族。unix產品族由unix button和unix text產品構成;而windows產品族由windows button和windows text產品構成。

系統對產品物件的建立需求由乙個工程的等級結構滿足,其中有兩個具體工程角色,即unixfactory和windowsfactory。unixfactory物件負責建立unix產品族中的產品,而windowsfactory物件負責建立windows產品族中的產品。這就是抽象工廠模式的應用,抽象工廠模式的解決方案如下圖:

顯然,乙個系統只能夠在某乙個作業系統的視窗環境下執行,而不能同時在不同的作業系統上執行。所以,系統實際上只能消費屬於同乙個產品族的產品。

在現代的應用中,抽象工廠模式的使用範圍已經大大擴大了,不再要求系統只能消費某乙個產品族了。

總結:

無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極為相似的,他們的最終目的都是為了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因為他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了乙個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對於抽象工廠模式,當減少乙個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。

所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。

java設計模式之抽象工廠模式

以肯德基麥當勞為例 解析抽象的工廠模式,以下是 的實現 第乙個介面 hb 建立漢堡的工廠 package com.factory.hb hb 漢堡 author lx public inte ce factoryhb 第乙個實現類 肯德基的漢堡 package com.imple.hb import...

Java設計模式之抽象工廠模式

上兩篇講解了簡單工廠模式和工廠方法模式,下面講解工廠模式的最後乙個抽象工廠模式 隨著客戶的要求越來越高,寶馬車需要不同配置的空調和發動機等配件。於是這個工廠開始生產空調和發動機,用來組裝汽車。這時候工廠有兩個系列的產品 空調和發動機。寶馬320li系列配置a型號空調和a型號發動機,寶馬520li系列...

Java設計模式之抽象工廠模式

一 什麼是抽象工廠模式 抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的。抽象工廠模式可以向客戶端提供乙個藉口,使得客戶端在不必指定產品的具體型別的情況下,能夠建立多個產品族的產品物件。fruit介面 public inte ce fruit public abstract fruit ba...