提醒:
這篇文章是繼java開發,必須要懂的23種設計模式——工廠模式(簡單工廠模式)文章後,進階版工廠模式的講解,建議先瀏覽一下這篇文章,再繼續看下去。
瞭解之後,我們來說說怎麼去讓工廠模式去符合開閉原則!
分析:
我們通過簡單工廠模式知道,不滿足開閉原則的罪魁禍首,是工廠類裏邊的判斷語句。只要增加了一個商品,就必須增加一個判斷語句,以及相應的實例化和初始化代碼,我們把代碼寫死了!
那麼,怎麼把判斷語句去掉?
想去掉判斷語句,我們得想一想:爲什麼需要判斷語句?
因爲工廠生產了兩件商品,消費者只要一個商品,就需要去判斷一下,消費者究竟要那個。
那,我們把工廠拆分一下,分成錢包製造廠和大衣製造廠。讓它們都只生產一件商品,消費者來消費,不就不需要判斷了!
完美!
動工,擼代碼!
江南皮革廠總廠(接口)
package factory.methodFactory;
public interface 江南皮革廠總廠 {
Skin getSkin();
}
江南皮革廠分廠_____大衣製造廠(實現工廠接口的工廠)
package factory.methodFactory;
import factory.methodFactory.Coat;
public class 江南皮革廠分廠_____大衣製造廠 implements 江南皮革廠總廠 {
@Override
public Skin getSkin() {
return new Coat("貂皮大衣","80000¥");
}
}
江南皮革廠分廠_____錢包製造廠(實現工廠接口的工廠)
package factory.methodFactory;
import factory.methodFactory.Wallet;
public class 江南皮革廠分廠_____錢包製造廠 implements 江南皮革廠總廠 {
@Override
public Skin getSkin() {
return new Wallet("真皮錢包","800¥");
}
}
皮製品要遵守一定的規範——要有名字和價格(皮製品接口)
package factory.methodFactory;
public interface Skin {
public void name();
public void pice();
}
皮大衣(實現皮製品接口的類)
package factory.methodFactory;
public class Coat implements Skin {
public String name;
public String pice;
public Coat(String name ,String pice) {
this.name=name;
this.pice=pice;
}
@Override
public void name() {
System.out.println("名字:"+name);
}
@Override
public void pice() {
System.out.println("價格:"+pice);
}
}
皮錢包(實現皮製品接口的類)
package factory.methodFactory;
public class Wallet implements Skin {
public String name;
public String pice;
public Wallet(String name ,String pice) {
this.name=name;
this.pice=pice;
}
@Override
public void name() {
System.out.println("名字:"+name);
}
@Override
public void pice() {
System.out.println("價格:"+pice);
}
}
消費者
package factory.methodFactory;
public class Consumer {
public static void main(String[] args) {
Skin wallet =new 江南皮革廠分廠_____錢包製造廠().getSkin();
wallet.name();
wallet.pice();
Skin coat = new 江南皮革廠分廠_____大衣製造廠().getSkin();
coat.name();
coat.pice();
}
}
運行結果:
名字:真皮錢包
價格:800¥
名字:貂皮大衣
價格:80000¥
測試:
按照咱們的推論,現在應該已經滿足開閉原則了。咱們添加個商品試試。
皮帽(實現皮製品接口的類)
package factory.methodFactory;
public class Hat implements Skin {
public String name;
public String pice;
public Hat(String name ,String pice) {
this.name=name;
this.pice=pice;
}
@Override
public void name() {
System.out.println("名字:"+name);
}
@Override
public void pice() {
System.out.println("價格:"+pice);
}
}
江南皮革廠分廠_____皮帽製造廠(實現工廠接口的工廠)
package factory.methodFactory;
public class 江南皮革廠分廠_____皮帽製造廠 implements 江南皮革廠總廠 {
@Override
public Skin getSkin() {
return new Hat("皮帽","60¥");
}
}
測試:
package factory.methodFactory;
public class Consumer {
public static void main(String[] args) {
Skin wallet =new 江南皮革廠分廠_____錢包製造廠().getSkin();
wallet.name();
wallet.pice();
Skin coat = new 江南皮革廠分廠_____大衣製造廠().getSkin();
coat.name();
coat.pice();
Skin hat = new 江南皮革廠分廠_____皮帽製造廠().getSkin();
hat.name();
hat.pice();
}
}
運行結果:
名字:真皮錢包
價格:800¥
名字:貂皮大衣
價格:80000¥
名字:皮帽
價格:60¥
在沒有改變原來代碼的基礎上,新增Cat類,皮帽工行,就可以在消費類裏邊直接獲得到了!!
以上爲個人所學和總結,如果那裏不對,希望看到的大佬指正批評!