工廠模式之方法工廠
阿新 • • 發佈:2018-12-28
1 簡單工廠缺點 以及方法工廠實現邏輯
通過我的上一篇部落格 工廠模式之簡單工廠 我們瞭解了什麼是簡單工廠。我們可以通過建立鋼工廠類物件來獲取不同型別的鋼物件。但是如果我們每次新增加一種型別的鋼,我們需要對鋼工廠類的getSteel 方法進行修改。這顯然是違反了設計模式的開放閉合原則。而我們的方法工廠剛好彌補了簡單工廠的這個缺點。
那我們方法工廠是怎麼做的呢? 首先我們先提供工廠的抽象,也就是工廠生產的標準。然後將原來的一個工廠根據鋼的種類拆分成各自的工廠,同時實現工廠的抽象,也可以理解成符合工廠的生產標準。獲取鋼物件由原來的一個工廠中獲取 變成通過不同種類的工廠來獲取。
2 方法工廠程式碼實現
1 定義工廠的抽象 也是定義工廠的生產規範
getSteel 方法就是生產鋼的規範。
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public interface Factory {
public Steel getSteel();
}
2 為每種型別的鋼建立各自的工廠類。
生產鑄鋼的工廠類
package cn.zhuoqianmingyue.examples.factorypattern.method; import cn.zhuoqianmingyue.examples.factorypattern.simple.CastSteel; import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel; public class CastSteelFactory implements Factory{ @Override public Steel getSteel() { return new CastSteel(); } }
生產冷拉鋼 的工廠類
package cn.zhuoqianmingyue.examples.factorypattern.method; import cn.zhuoqianmingyue.examples.factorypattern.simple.ColdDrawnSteel; import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel; public class ColdDrawnSteelFactory implements Factory { @Override public Steel getSteel() { return new ColdDrawnSteel(); } }
生產鍛鋼的工廠類
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.ForgedSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class ForgedSteelFactory implements Factory{
@Override
public Steel getSteel() {
return new ForgedSteel();
}
}
生產熱軋鋼的工廠類
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.HotRolledSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class HotRolledSteelFactory implements Factory{
@Override
public Steel getSteel() {
return new HotRolledSteel();
}
}
方法工廠模式的測試類
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class ApplicationTest {
public static void main(String[] args) {
//生產鑄鋼
Factory castSteelFactory = new CastSteelFactory();
Steel castSteel = castSteelFactory.getSteel();
log(castSteel.getName());
//生產冷拉鋼
Factory coldDrawnSteelFactory = new ColdDrawnSteelFactory();
Steel coldDrawnSteel = coldDrawnSteelFactory.getSteel();
log(coldDrawnSteel.getName());
}
private static void log(String name) {
System.out.println("生產"+name+"成功!");
}
}
測試結果: