設(shè)計(jì)模式系列-抽象工廠模式
本文轉(zhuǎn)載自微信公眾號(hào)「花括號(hào)MC」,作者花括號(hào)MC。轉(zhuǎn)載本文請聯(lián)系花括號(hào)MC公眾號(hào)。
抽象工廠提供了一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定他們具體的類。簡單來說是為需要?jiǎng)?chuàng)建多個(gè)相關(guān)聯(lián)產(chǎn)品的場景提供了解決思路。
舉個(gè)例子
很多軟件都支持配置不同的顏色的主題,當(dāng)切換主題時(shí),所有按鈕樣式和顏色都會(huì)統(tǒng)一切換。
假設(shè)我們的軟件只有三類按鈕,分別是Button, TextField,以及ComboBox,并且我們的軟件只提供兩類主題,即紅色主題和綠色主題。
來看一下UML :
再來看一下具體代碼如何實(shí)現(xiàn)。
先來創(chuàng)建一個(gè)SkinFactory接口
- public interface SkinFactory {
- Button createButton();
- TextField createTextField();
- ComboBox createComboBox();
- }
通過實(shí)現(xiàn)SkinFactory實(shí)現(xiàn)綠色主題工廠
- //紅色主題工廠
- public class RedSkinFactory implements SkinFactory {
- @Override
- public Button createButton() {
- return new RedButton();
- }
- @Override
- public TextField createTextField() {
- return new RedTextField();
- }
- @Override
- public ComboBox createComboBox() {
- return new RedComboBox();
- }
- }
紅色主題工廠類類似,因?yàn)槠虿辉趩为?dú)列出。
來看一下客戶端如何使用
- public class Client {
- public static void main(String[] args){
- //通過切換不同工廠,可以達(dá)到所有按鈕顏色都變換的效果
- SkinFactory skinFactory = new RedSkinFactory();
- Button button = skinFactory.createButton();
- ComboBox comboBox = skinFactory.createComboBox();
- TextField textField = skinFactory.createTextField();
- button.display();
- comboBox.display();
- textField.display();
- }
- }
總結(jié)
抽象工廠是創(chuàng)建模式之一,抽象工廠適合創(chuàng)建一系列有相關(guān)性的多個(gè)產(chǎn)品,雖然抽象工廠在擴(kuò)展一個(gè)主題的按鈕時(shí)靈活方便,但是也有一定缺點(diǎn), 最大缺點(diǎn)就是想單獨(dú)增加一個(gè)不屬于任何主題的按鈕時(shí)比較麻煩,比如上面的例子中,如果想增加一個(gè)關(guān)閉按鈕,這個(gè)按鈕即不屬于紅色主題也不屬于綠主題,那么改動(dòng)起來就比較復(fù)雜。
工廠模式三兄弟:簡單工廠適合邏輯簡單,創(chuàng)建產(chǎn)品數(shù)量很少的場景,工廠模式適合創(chuàng)建獨(dú)立的產(chǎn)品,抽象工廠適合創(chuàng)建一系列有相關(guān)性的多個(gè)產(chǎn)品。