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