《一天一模式》— 抽象工廠模式

1、抽象工廠模式的概念

抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其餘工廠。該超級工廠又稱爲其餘工廠的工廠。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。java

在抽象工廠模式中,接口是負責建立一個相關對象的工廠,不須要顯式指定它們的類。每一個生成的工廠都能按照工廠模式提供對象。設計模式

2、何時使用抽象工廠模式

抽象工廠稍微有些複雜,可是使用場景卻很單一:若是你有一族對象,緯度大於一,那麼能夠考慮使用抽象工廠來建立對象。this

舉個例子來講明什麼是緯度大於一:spa

  • 奔馳有SRV和SUV,奧迪也有SRV和SUV,這就是兩個緯度,汽車品牌 + 車輛種類;
  • 華爲有手機和路由器,小米也有手機和路由器,這也是兩個緯度,設備品牌 + 設備類型;

因此說,在有緯度大於一的一族對象時,能夠考慮使用抽象工廠模式。設計

下面來看看怎麼用Java實現抽象工廠模式。code

3、如何使用抽象工廠模式

抽象工廠如何解決這種複雜對象的建立?我是這麼理解的:對象

  • 首先,抽象工廠也是能夠理解爲有兩個緯度,工廠的數量就是對象族羣某一緯度的數量,好比車輛的例子中,汽車品牌有奔馳和奧迪,那麼抽象工廠的數量就是2;
  • 其次,每一個抽象工廠的方法數量就是另外一個緯度的數量,例如車輛類型分爲SRV和SUV,因此每一個抽象工廠都有兩個方法,即createSUV和createSRV;

下面就以汽車的例子爲例,看看如何實現:blog

代碼以下:接口

// 對象族定義
public class Audi {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}


public class AudiSRV extends Audi { }

public class AudiSUV extends Audi { }

public class Benz {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class BenzSRV extends Benz { }

public class BenzSUV extends Benz { }

// 工廠定義
// 工廠數量等於 汽車類型的數量
// 工廠內的方法數量等於 汽車品牌的數量
// SRV工廠能夠生產奔馳的SRV和奧迪的SRV
// SUV工廠能夠生產奔馳的SUV和奧迪的SUV

public interface VehicleFactory {

    Audi createAudi();

    Benz createBenz();

}

public class SRVFactory implements VehicleFactory {

    public Audi createAudi() {
        Audi audi = new AudiSRV();
        audi.setName("AudiSRV");
        return audi;
    }

    public Benz createBenz() {
        Benz benz = new BenzSRV();
        benz.setName("BenzSRV");
        return benz;
    }

}

public class SUVFactory implements VehicleFactory {

    public Audi createAudi() {
        Audi audi = new AudiSUV();
        audi.setName("AudiSUV");
        return audi;
    }

    public Benz createBenz() {
        Benz benz = new BenzSUV();
        benz.setName("BenzSUV");
        return benz;
    }

}

根據套路,工廠數量等於 汽車類型的數量,工廠內的方法數量等於 汽車品牌的數量。因此,SRV工廠能夠生產奔馳的SRV和奧迪的SRV,SUV工廠能夠生產奔馳的SUV和奧迪的SUV。路由

也能夠反過來,定義SUV類型的兩種車輛和SRV類型的兩種車輛,那麼工廠就變換爲Benz工廠(生產奔馳SUV和SRV),Audi工廠(生產奧迪SUV和SRV),這樣可能更合理,可是要從具體業務場景來區分。抽象工廠的類型很靈活。

4、總結

抽象工廠模式,能夠在理解需求方面須要慢慢琢磨,可是使用場景很單一,代碼實現也很簡單。它有以下優勢:

  • 高內聚:抽象工廠模式隔離了具體對象的生產,客戶端只調用工廠建立對象便可(工廠類都有該優勢);
  • 擴展性強:增長新的工廠和對象,無須修改現有代碼,符合開閉原則;

以上就是我對抽象工廠模式的一些理解,有不足之處請你們指出,謝謝。

相關文章
相關標籤/搜索