抽象工廠模式
抽象工廠模式提供一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。
抽象工廠模式用來生產不同產品族的全部產品(對於新增加的產品無能爲力,支持增加產品族)。
抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是一種非常好的解決方式。
抽象工廠模式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 設計模式。