Grady Booch 提出的經典原則——「若設計過於複雜,就製造更多的物件」,是解決物件建立混亂的良方。在垃圾回收範例中,main() 裡的 switch 語句直接 new 具體類別,每新增一種垃圾就得修改此處,違反單一職責原則。解決之道是將建立邏輯封裝進專門的工廠方法。
工廠方法接收封裝建立資訊的 Info 物件,內部以 switch 判斷型別並回傳已上鑄為基礎類別(Trash)的參考。客戶端程式碼因此不需知道具體類別,僅透過多型操作物件。若未來需要更多建構參數,只需擴充 Info 類別(增欄位或繼承),工廠方法簽名完全不變。
// Info 封裝建立資料
class Info {
int type;
static final int MAX_NUM = 4;
double data;
Info(int typeNum, double dat) {
type = typeNum % MAX_NUM;
data = dat;
}
}
// 工廠方法集中建立邏輯
static Trash factory(Info i) {
switch(i.type) {
case 0: return new Aluminum(i.data);
case 1: return new Paper(i.data);
case 2: return new Glass(i.data);
case 3: return new Cardboard(i.data); // 新增型別只改這裡
default: return new Aluminum(i.data);
}
}
// main() 變得乾淨簡潔
for(int i = 0; i < 30; i++)
bin.addElement(Trash.factory(new Info((int)(Math.random() * Info.MAX_NUM), Math.random() * 100)));
工廠方法將「新增型別」這一核心變化點封裝在單一位置。雖然 main() 中建立 Info 的程式碼仍可能隨參數改變而調整,但可進一步透過自動化建構 Info(如傳入參數向量)來消除這一耦合。這正是設計模式的核心價值:識別系統中最昂貴、最頻繁的變化,並為其建立穩定的抽象層。