前面在講觀察者模式的時候,第二個範例是按下按鈕,會隨機由天使或魔鬼給出意見讓你做決定。其中有一段程式碼是這樣的:
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);
}
}
這就是簡單工廠模式的雛形,不過大家要先記住「簡單工廠模式不等於工廠模式」,原因為何下篇再來講解~
Disclaimer
因為讀的是原文版,所以難免會有翻譯詞不達意或是專有名詞上的差異,有錯誤的話歡迎在留言區一起交流!