大量產品需要頻繁創建,且共享同一接口時,使用工廠方法模式封裝實例化邏輯,解耦調用方與具體實現類。
public interface Job {
void say();
}
public class ReadJob implements Job {
@Override public void say() { System.out.println("This is read Job"); }
}
public class WriteJob implements Job {
@Override public void say() { System.out.println("This is write Job"); }
}
public class SimpleJobFactory {
public static final String READ = "read";
public static final String WRITE = "write";
public Job produce(String type) {
if (READ.equalsIgnoreCase(type)) return new ReadJob();
else if (WRITE.equalsIgnoreCase(type)) return new WriteJob();
else { System.out.println("Parameter error"); return null; }
}
}
缺點: 字符串參數易拼寫錯誤,運行時才發現,違反開閉原則(新增產品需修改工廠)。
public class MethodsJobFactory {
public Job produceReadJob() { return new ReadJob(); }
public Job produceWriteJob() { return new WriteJob(); }
}
優點: 編譯期檢查方法名,避免字符串錯誤。缺點: 需實例化工廠對象,新增產品仍需修改工廠類。
public class MethodsJobStaticFactory {
public static Job produceReadJob() { return new ReadJob(); }
public static Job produceWriteJob() { return new WriteJob(); }
}
優點: 無需實例化,直接類名調用,代碼簡潔。缺點: 同樣違反開閉原則,靜態方法難以覆寫/擴展。
public class Test {
public static void main(String[] args) {
// 靜態工廠調用
Job j1 = MethodsJobStaticFactory.produceReadJob();
Job j2 = MethodsJobStaticFactory.produceWriteJob();
j1.say(); j2.say();
}
}
下一篇將介紹抽象工廠模式,解決「產品族」創建問題,真正實現開閉原則。