設計模式之工廠模式

2021-09-28 11:29:56 字數 4161 閱讀 1503

工廠模式算是最常見的設計模式之一了,使用工廠模式可以讓客戶端直接呼叫工廠類建立自己需要的物件而無需自己去建立(此處物件一般是某個類的實現類)。工廠模式又包括簡單工廠模式,工廠模式和抽象工廠模式。

簡單點說就是簡單工廠類通過客戶端傳入的某些引數new符合要求的物件供客戶端使用,這裡我們用奶茶的口味作為例子,我們在奶茶店購買奶茶只要說出想要的口味奶茶店就給我們做好了我們想要的奶茶。

主要角色有:

抽象產品類:milktea類,具體產品的抽象;

具體產品類:primaryodormilktea類,fruitmilktea類和bubblemilktea類,在工廠中真正被建立的類;

工廠類:milkteashop類,負責根據條件建立具體產品類。

抽象奶茶類:

abstract class milktea 

}

具體奶茶類:

class primaryodormilktea extends milktea 

}class bubblemilktea extends milktea

}class fruitmilktea extends milktea

}

奶茶店(工廠):

class milkteashop 

}}

測試程式及輸出結果:

//測試程式

public static void main(string args)

//輸出結果

我喝的是原味奶茶...

我喝的是珍珠奶茶...

我喝的是水果奶茶...

對不起,我們店沒有這種口味的奶茶!

客戶端不需要自己去建立物件,也不需要處理建立物件時的邏輯,這一切交給工廠類來做。但這裡的工廠類(即奶茶店)不管是新增加了一種口味的奶茶還是去掉了一種口味的奶茶還是修改了一種口味的奶茶都需要修改工廠類,很明顯的違反了開閉原則,乙個設計良好的設計模式起碼遵守的就是開閉原則,這就引出了工廠模式。

定義乙個建立產品物件的工廠介面,將產品物件的實際建立工作推遲到具體子工廠類當中。這滿足建立型模式中所要求的「建立與使用相分離」的特點。

從定義中我們可以知道工廠模式中工廠類被抽象了出來,每種奶茶都有對應的奶茶店,這就是工廠模式與簡單工廠模式的區別,解決了簡單工廠模式違反開閉原則的問題。

主要角色:

抽象產品類:milktea類,產品的抽象;

具體產品類:primaryodormilktea類,bubblemilktea類和fruitmilktea類,工廠類真正建立的類;

抽象工廠類:abstractmilkteashop類,定義了建立產品的方法;

具體工廠類:primaryodormilkteashop類,bubblemilkteashop類和fruitmilkteashop類,分別生成對應的產品類,達到了解耦的目的。

工廠模式的抽象奶茶類和具體奶茶類與簡單工廠中相同。

抽象奶茶店:

abstract class abstractmilkteashop
具體奶茶店:

class primaryodormilkteashop extends abstractmilkteashop

}class bubblemilkteashop extends abstractmilkteashop

}class fruitmilkteashop extends abstractmilkteashop

}

測試程式及輸出結果:

//測試程式

public static void main(string args)

//輸出結果

我喝的是原味奶茶...

我喝的是珍珠奶茶...

我喝的是水果奶茶...

因為要建立具體的奶茶店物件,所以看起來還比簡單工廠複雜了些。但在你想新增奶茶口味的時候就會發現只需要新增乙個繼承了抽象奶茶店的類就可以了,無需修改原有**。刪除奶茶口味的時候也是只需要刪除對應的工廠類,無需修改其他**,即遵守了開閉原則。

抽象工廠模式(abstract factory pattern)隸屬於設計模式中的建立型模式,用於產品族的構建。抽象工廠是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠是指當有多個抽象角色時使用的一種工廠模式。抽象工廠模式可以向客戶端提供乙個介面,使客戶端在不必指定產品的具體情況下,建立多個產品族中的產品物件。 

抽象工廠模式的重點是產品族,我看到有的文章說抽象工廠模式是對工廠模式的改進,我覺得是不合理的,這兩個模式應用的場景不太一樣,工廠更側重於同一產品等級的建立,抽象工廠更側重於產品族的建立。

現在奶茶店要賣奶茶和麵包的**,分別有原味**(原味奶茶和原味麵包),珍珠**(珍珠奶茶和珍珠麵包)和水果**(水果奶茶和水果麵包)。由工廠模式我們可以想到新增抽象麵包類和具體麵包類,在抽象奶茶店方法和具體奶茶店方法中新增製作麵包的方法就可以實現。

抽象產品類:milktea和bread類,兩種產品的抽象類;

具體產品類:primaryodormilktea類,bubblemilktea類和fruitmilktea類,primaryodorbread類,bubblebread類和fruitbread類;

抽象工廠類:abstractmilkteashop類,與工廠模式不同的是有多個方法分別生成不同的屬於同一產品族的產品;

具體工廠類:primaryodormilkteashop類,bubblemilkteashop類和fruitmilkteashop類,分別生成相應的產品族。

抽象麵包類:

abstract class bread 

}

具體麵包類:

class primaryodorbread extends bread 

}class bubblebread extends bread

}class fruitbread extends bread

}

抽象奶茶店類:

abstract class abstractmilkteashop
具體奶茶店類:

class primaryodormilkteashop extends abstractmilkteashop

@override

bread makebread()

}class bubblemilkteashop extends abstractmilkteashop

@override

bread makebread()

}class fruitmilkteashop extends abstractmilkteashop

@override

bread makebread()

}

測試程式及輸出結果:

//測試程式

public static void main(string args)

//輸出結果

原味**的原味奶茶製作完成...

我喝的是原味奶茶...

原味**的原味麵包製作完成...

我吃的是原味麵包...

珍珠**的珍珠奶茶製作完成...

我喝的是珍珠奶茶...

珍珠**的珍珠麵包製作完成...

我吃的是珍珠麵包...

水果**的水果奶茶製作完成...

我喝的是水果奶茶...

水果**的水果麵包製作完成...

我吃的是水果麵包...

可以看到抽象工廠模式與工廠模式的差別就在於抽象工廠中製作的是多個產品(這些產品往往是乙個產品族)。與工廠模式一樣,需要增加**種類只需要新增相應的具體奶茶類,具體麵包類和具體奶茶店類。但抽象工廠中增加或者刪除或者修改某個產品時抽象工廠和具體工廠都需要修改,違反了開閉原則。

設計模式 設計模式之工廠模式

工廠方法模式 建立模式 使用場景?作用?形態?場景 大量類似的實體類 要建立的實體類都是同一本質的東西 披薩 有部分類似功能 準備 烘烤 切法 實現方式不一樣 準備的材料不同 烘烤時間不同 切法不同 將繁瑣複雜的建立類的過程聚集在一起,有序清晰 把具體例項化的過程從客戶 中抽離 作用 1 將建立物件...

c 設計模式 之 工廠模式之 工廠模式

1 uml類圖 實現和依賴關係 實現 sportfactory jeepfactory hatchbackfactory 實現 ifactory 介面 sportcar jeepcar hatchbackcar 實現 icar 介面 依賴 ifactory 依賴 icar sportfactory ...

設計模式 工廠模式之簡單工廠模式

定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...