iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

深入淺出設計模式 (Head First Design Pattern) - 重點整理及範例分享系列 第 11

[深入淺出設計模式] Ch4 The Factory Pattern (1) 【工廠模式】前言

  • 分享至 

  • xImage
  •  

前言

前面在講觀察者模式的時候,第二個範例是按下按鈕,會隨機由天使或魔鬼給出意見讓你做決定。其中有一段程式碼是這樣的:

public class Button {
    private Listener role;

    public void makeDecision(int r){
        if(r % 2 == 0){            
           role = new Angel();
        }
        else{
            role = new Devil(); 
        }
    } 

    public void pressBtn(){
        System.out.println("Should I do it?");

        Random rand = new Random();
        int randNum = rand.nextInt(100);
        
        makeDecision(randNum);
        role.getOpinion();
    }
}

負責下決定的方法 makeDecision() 會決定要選天使或魔鬼,但是今天如果角色不幸的增加了父母、朋友的話,程式可能會變成⋯⋯

public void makeDecision(int r){
       if(r % 2 == 0){            
          role = new Angel();
       }
       else if(r % 3 == 0){
           role = new Devil(); 
       }
       else if(r % 7 == 0){
           role = new Parents();
       }
       else if(r % 13){
           role = new Friend();
       }
   } 

這代表著,只要角色一多,判斷式就會一直變長,而且我們就要回來找到這一段程式碼修改,似乎是背離了開放封閉原則,
每當問題出現,代表我們又需要新的設計模式了!
我們可以增加一個類別 RoleGenerateFactory(),把判斷式整個拉出來,這樣在Button() 中就不用去處理角色產生的細節啦。

public class RoleGenerateFactory(){
    public void createRole(int r){
        Listener role = null;
        if(r % 2 == 0){            
           role = new Angel();
        }
        else if(r % 3 == 0){
            role = new Devil(); 
        }
        else if(r % 7 == 0){
            role = new Parents();
        }
        else if(r % 13){
            role = new Friend();
        }
        return role;
    }
}
public class Button {
    private Listener role;
    public RoleGenerateFactory factory; 
    public void makeDecision(int r){
        role = factory.createRole(r);
    }     
}

這就是簡單工廠模式的雛形,不過大家要先記住「簡單工廠模式不等於工廠模式」,原因為何下篇再來講解~


補充

  • 開放封閉原則
    • Open for extension but closed for modification
    • 在不修改程式的前提去做功能調整

參考資料:

  1. 《深入淺出設計模式 (Head First Design Patterns)
  2. https://fonu195713.github.io/docs/computer_science/design_pattern/simple_factory_pattern/

Disclaimer
因為讀的是原文版,所以難免會有翻譯詞不達意或是專有名詞上的差異,有錯誤的話歡迎在留言區一起交流!


上一篇
[深入淺出設計模式] 聊一聊目前為止設計模式改變了我什麼?
下一篇
[深入淺出設計模式] Ch4 The Factory Pattern (2) - 【工廠模式】Simple Factory 範例: Pizza Store
系列文
深入淺出設計模式 (Head First Design Pattern) - 重點整理及範例分享35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言