Java學習筆記之--------抽象工廠模式

抽象工廠模式

抽象工廠模式提供一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。

抽象工廠模式用來生產不同產品族的全部產品(對於新增加的產品無能爲力,支持增加產品族)。

抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是一種非常好的解決方式。

抽象工廠模式demo

public interface Engine {
	void run();
	void start();
}

class LuxuryEngine implements Engine{
	@Override
	public void run() {
		System.out.println("轉的快");
	}
	@Override
	public void start() {
		System.out.println("啓動快!可以自動啓停!");
	}
}

class LowEngine implements Engine{
	@Override
	public void run() {
		System.out.println("轉的慢");
	}
	@Override
	public void start() {
		System.out.println("啓動慢!");
	}
}
public interface Seat {
	void massage();
}

class LuxurySeat implements Seat{
	@Override
	public void massage() {
		System.out.println("可以自動按摩");
	}
}

class LowSeat implements Seat{
	@Override
	public void massage() {
		System.out.println("不能按摩");
	}
}
public interface Tyre {
	void revolve();
}

class LuxuryTyre implements Tyre{
	@Override
	public void revolve() {
		System.out.println("旋轉不磨損");
	}
}

class LowTyre implements Tyre{
	@Override
	public void revolve() {
		System.out.println("磨損快");
	}
}
public interface CarFactory {
	Engine createEngine();
	Seat createSeat();
	Tyre createTyre();
}
public class LowCarFactory implements CarFactory{
	@Override
	public Engine createEngine() {
		return new LowEngine();
	}
	@Override
	public Seat createSeat() {
		return new LowSeat();
	}
	@Override
	public Tyre createTyre() {
		return new LowTyre();
	}
}
public class LuxyryCarFactory implements CarFactory {
	@Override
	public Engine createEngine() {
		return new LuxuryEngine();
	}
	@Override
	public Seat createSeat() {
		return new LuxurySeat();
	}
	@Override
	public Tyre createTyre() {
		return new LuxuryTyre();
	}
}
public class Client {
	public static void main(String[] args) {
		System.out.println("====高級發動機的特性====");
		CarFactory luxyryCarFactory = new LuxyryCarFactory();
		Engine e = luxyryCarFactory.createEngine();
		e.run();
		e.start();

		System.out.println("====低級輪胎的特性====");
		CarFactory lowCarFactory = new LowCarFactory();
		Tyre lowCarFactoryTyre = lowCarFactory.createTyre();
		lowCarFactoryTyre.revolve();
	}
} 

運行結果如下:

可以看到,抽象工廠模式支持多個業務品種、業務分類。抽象工廠的每個方法都被聲明成抽象,子類的方法覆蓋這些方法來創建某些對象。所以說,抽象工廠的方法經常以工廠方法的方式實現。

類圖

類圖中將未使用到的Seat相關先隱藏了,不然生成的類圖十分龐大。

工廠模式和抽象工廠模式的比較

簡單工廠模式(靜態工廠模式):雖然某種程度不符合設計原則,但是實際使用最多。(雖然簡單工廠模式不是一種設計模式,但是它在實際應用中使用的場景還是很多的)。

工廠方法模式:不修改已有類的前提下,通過增加新的工廠類實現擴展。

抽象工廠模式:不可增加產品,可以增加產品族。(產品族:是指位於不同產品等級結構中,功能相關聯的產品組成的家族。)

 

工廠方法與抽象工廠都是負責創建對象,工廠方法用的是繼承,而抽象工廠用的是對對象的組合。

利用工廠方法創建對象,需要擴展一個類,並覆蓋它的工廠方法。這個工廠方法是用來創建對象的。整個工廠方法模式就是通過子類來創建對象。用這種做法,客戶只需要他們所使用的抽象類型就可以了,由子類來負責決定具體類型,換句話說,工廠方法負責將客戶從具體類型中解耦。

抽象工廠使用具體工廠用來創建產品(這裏使用了工廠方法模式)。而工廠方法中,抽象創建者中所實現的代碼通常會用到子類所創建的具體類型。

應用場景

JDK中Calendar的getInstance()

JDBC中Connection對象的獲取

Hibernate中SessionFactory創建session

spring中IOC容器創建管理bean對象

XML解析時的DocumentBuilderFactory創建解析器對象

反射Class對象的newInstance()

 

以上爲抽象工廠模式的學習筆記,此文章爲尚學堂視頻的學習筆記+自己總結。參考資料:Head First 設計模式。

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