1. 程式人生 > 其它 >設計模式-簡單工廠、工廠模式和抽象工廠

設計模式-簡單工廠、工廠模式和抽象工廠

技術標籤:設計模式javaspring

今天來開始記錄自己的設計模式學習過程和感悟。希望備戰春招的我能夠獲得一個好的結果。
今天說一下設計模式中的三種,簡單工廠,工廠模式和抽象工廠。

簡單工廠,因為其中獲取物件的方法一般為靜態,所以也叫做靜態工廠
一般有三個角色,介面(或抽象類),具體實現類,工廠
先說下條件設定,既然是工廠,就是要創造東西的,我們就創造空調吧。
建立空調介面(抽象類也可以),有一個啟動方法start();
然後實現該介面建立具體的格力空調和美的空調

public interface AirCondition {
    void start();
}

class geli_AirCondition
implements AirCondition{ public void start() { System.out.println("格力空調啟動"); } } class meidi_AirCondition implements AirCondition{ public void start() { System.out.println("美的空調啟動"); } }

編寫簡單工廠的程式碼,簡單工廠的特點就是根據客戶端指定的引數不同獲取不同的物件。

public class SimpleFactory {
	
	public
static AirCondition getAirCondition(String keyWord) { if (keyWord.equals("格力")) { return new geli_AirCondition(); } if (keyWord.equals("美的")) { return new meidi_AirCondition(); } return null; } }

測試程式碼

public class Test {

	public static void main(String[
] args) { AirCondition geli=SimpleFactory.getAirCondition("格力"); geli.start(); AirCondition meidi=SimpleFactory.getAirCondition("美的"); meidi.start(); } }

執行結果,根據客戶端指定的引數不同,從工廠裡獲得了想要的物件

可是這樣有一個很重大的問題,當我們系統內需要擴充套件新的空調物件時,比如奧克斯空調,那麼我們還需要修改SimpleFactory類的內部程式碼,增加新的判斷邏輯,這就違反了設計模式中的開閉原則,即希望我們的程式是對修改關閉,對擴充套件開放。這個問題我們可以使用工廠模式進行優化

工廠模式,指把物件的生產延遲到工廠子類中,工廠類本身只需要指定生產何種物品,客戶端需要什麼具體的產品,就找對應的工廠去要
一般有四個角色,抽象介面,具體實現類,抽象工廠,具體工廠。
現在我們用工廠模式重寫上面的程式碼

空調介面,和具體空調實現類

public interface AirCondition {
    void start();
}

class geli_AirCondition implements AirCondition{

	public void start() {
		System.out.println("格力空調啟動");
	}
}

class meidi_AirCondition implements AirCondition{

	public void start() {
		System.out.println("美的空調啟動");	
	}
}

編寫工廠程式碼,有抽象工廠和具體工廠,抽象工廠定義產品,具體工廠生產具體的產品

public interface Factory {//抽象工廠
	AirCondition getAirCondition();
}

class geli_Factory implements Factory{//具體的格力工廠
	public AirCondition getAirCondition() {		
		return new geli_AirCondition();
	}
}

class meidi_Factory implements Factory{//具體的美的工廠
	public AirCondition getAirCondition() {	
		return new meidi_AirCondition();
	}
}

測試程式碼

public class Test {

	public static void main(String[] args) {
		AirCondition geli=new geli_Factory().getAirCondition();
		geli.start();
		
		AirCondition meidi=new meidi_Factory().getAirCondition();
		meidi.start();
	}
}

在這裡插入圖片描述
這樣就解決了我們要新增奧克斯空調的問題,我們只需要建立奧克斯空調類和奧克斯空調工廠,就可以了,符合開閉原則

現在又有一個問題,比如現在天氣冷了,冬天洗澡家家都需要一個熱水器,而這個產品格力和美的兩家公司都會生產,如何使用工廠的概念把這個產品加到已有的空調產品生產過程中呢???

答案就是可以使用抽象工廠,抽象工廠主要是引入了產品族的概念,
一般也是有抽象介面,具體實現類,抽象工廠,具體工廠。
用咱們舉得例子給大家做個示範

產品族產品
美的空調 熱水器
格力空調 熱水器

具體到我們的抽象工廠程式碼書寫時,就可以把每個產品族當作一個工廠
現在建立新的熱水器介面和熱水器實現類

public interface Heater {
       void start();
}

class geli_Heater implements Heater{

	public void start() {
		System.out.println("格力熱水器啟動了");	
	}	
}
class meidi_Heater implements Heater{
	
	public void start() {
		System.out.println("美的熱水器啟動了");
	}	
}

抽象工廠的實現程式碼

public interface Abstract_Factory {//抽象工廠
	
	AirCondition getAirCondition();
	Heater getHeater();
}
class geli_Factory implements Abstract_Factory{//具體的格力工廠

	public AirCondition getAirCondition() {	
		return new geli_AirCondition();
	}

	public Heater getHeater() {
		return new geli_Heater();
	}	
}
class meidi_Factory implements Abstract_Factory{//具體的美的工廠

	public AirCondition getAirCondition() {		
		return new meidi_AirCondition();
	}

	public Heater getHeater() {
		return new meidi_Heater();
	}
}

測試程式碼

public class Test {

	public static void main(String[] args) {
		AirCondition geli_AirCondition=new geli_Factory().getAirCondition();
		geli_AirCondition.start();//從格力工廠獲取空調啟動
		
		Heater geli_Heater=new geli_Factory().getHeater();
		geli_Heater.start();//從格力工廠獲取熱水器啟動

		
		AirCondition meidi_AirCondition=new meidi_Factory().getAirCondition();
		meidi_AirCondition.start();//從美的工廠獲取空調啟動
		
		Heater meidi_Heater=new meidi_Factory().getHeater();
		meidi_Heater.start();//從美的工廠獲取熱水器啟動
	}

}

結果
在這裡插入圖片描述
以上就是通過空調,熱水器和格力,美的兩個品牌名做出的關於三種工廠模式的程式碼實現,每種工廠形式都有它自己的優缺點,希望大家能通過今天的例子,有所收穫,程式碼可以直接複製執行,也可使照著我的程式碼寫 深刻體會一下每個工廠的特點.

我在此簡單總結一下
簡單工廠,因獲取物件方法一般為靜態,又叫靜態工廠,客戶端通過不同的引數向工廠申請不同的物件,但是在系統新增新產品時需要修改工廠原始碼,違反了開閉原則

工廠模式,定義抽象工廠,由具體的工廠實現類生產相應的產品,客戶端通過獲取不同的工廠獲取不同的產品,但是在新增新的產品型別時有所欠缺,且系統中物件越多,對應的工廠類就越多,可能會導致系統內部類過多的問題

抽象工廠,通過引入產品族的概念,使得工廠的能力由生產單一產品型別升級到多種產品型別,是三種工廠中能力最強的一種。

大家也可以自己找找Java及相關框架中有哪些運用到了這三種工廠模式,歡迎大家來跟我討論