java開發,必須要懂的23種設計模式——工廠模式(工廠方法模式)

提醒:

這篇文章是繼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類,皮帽工行,就可以在消費類裏邊直接獲得到了!!

 

以上爲個人所學和總結,如果那裏不對,希望看到的大佬指正批評!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章