2、工廠模式

工廠模式

前言

工廠模式又稱爲建立模式,它是建對象的一種最佳方式。工廠模式的本質就是用工廠方法代替new操做建立一種實例化對象的方式。java

在以前,若是咱們想實例化一個對象Simple,通常會想到的方法就是經過構造器來建立Simple simple = new Simple(參數)。可是,若是建立simple實例時所作的初始化工做不是像賦值這樣簡單的事,多是很長一段代碼,那麼每當你須要建立simple這個對象的時候,你都須要寫這一段很長的代碼。這樣咱們代碼的耦合性就會很是高。因此咱們就須要將建立實例的工做和使用使用實例的工做分開,工廠模式會使用工廠方法將建立實例的工做封裝起來。這樣咱們在須要調用對象的時候就不須要關心那些複雜的實例化問題。設計模式

簡單工廠模式

簡單工廠模式中有抽象產品類:用來定義具體產品的共有屬性,工廠類則負責生產具體產品。app

假設咱們須要生產不一樣品牌的手機設計

那麼咱們能夠先來定義一個Phone接口code

public interface Phone {
    String getBrand();
}

而後來建立兩個手機品牌:Apple和Huawei對象

public class Apple implements Phone {
    public String getBrand() {
        return "apple";
    }
}
public class Huawei implements Phone {
    public String getBrand() {
        return "huawei";
    }
}

定義一個工廠來生產手機繼承

public class SimpleFactory {
    public static Phone getPhone(String PhoneName){
        if ("apple".equals(PhoneName)){
            return new Apple();
        }else if ("Huawei".equals(PhoneName)){
            return new Huawei();
        }
        return null;
    }
}

小結:接口

從簡單工廠中咱們可使用一個靜態方法將對象的建立和使用分離開。咱們只須要調用方法傳遞參數就能夠得到咱們須要的對象。get

但咱們會發現簡單工廠模式存在一系列問題:產品

  • 工廠類集中了全部實例(產品)的建立邏輯,一旦這個工廠不能正常工做,整個系統都會受到影響;
  • 違背「開放 - 關閉原則」,一旦添加新產品就不得不修改工廠類的邏輯,這樣就會形成工廠邏輯過於複雜。
  • 簡單工廠模式因爲使用了靜態工廠方法,靜態方法不能被繼承和重寫,會形成工廠角色沒法造成基於繼承的等級結構。

爲了解決上述的問題,咱們又使用了一種新的設計模式:工廠方法模式。

工廠方法模式

工廠方法模式,又稱工廠模式、多態工廠模式和虛擬構造器模式,經過定義工廠父類負責定義建立對象的公共接口,而子類則負責生成具體的對象。

將類的實例化(具體產品的建立)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該實例化(建立)哪個類。

下面咱們將上面簡單工廠模式中生產手機的例子修改成使用工廠方法模式

建立抽象工廠類,定義具體工廠的公共接口

public abstract class PhoneFactory {
    Phone getPhone();
}

建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品實例的方法

public class AppleFactory extends PhoneFactory {
    public Phone getPhone() {
        return new Apple();
    }
}

public class HuaweiFactory extends PhoneFactory {
    public Phone getPhone() {
        return new Huawei();
    }
}

外界經過調用具體工廠類的方法,從而生產出不一樣手機

小結:

優勢

  • 更符合開-閉原則,即新增一種產品時,只須要增長相應的具體產品類和相應的工廠子類便可;
  • 符合單一職責原則,每一個具體工廠類只負責建立對應的產品;
  • 不使用靜態工廠方法,能夠造成基於繼承的等級結構;

缺點

  • 添加新產品時,除了增長新產品類外,還要提供與之對應的具體工廠類,系統類的個數將成對增長,在必定程度上增長了系統的複雜度;同時,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷;

  • 雖然保證了工廠方法內的對修改關閉,但對於使用工廠方法的類,若是要更換另一種產品,仍然須要修改實例化的具體工廠類;

抽象工廠模式

抽象工廠是全部形態的工廠模式中最爲抽象和最具通常性的一種形態。抽象工廠是指當有多個抽象角色時使用的一種工廠模式。抽象工廠模式能夠向客戶端提供一個接口,使客戶端在沒必要指定產品的具體狀況下,建立多個產品族中的產品對象。

抽象工廠模式相對於工廠方法模式來講,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠類,而抽象工廠模式是多個產品系列一個工廠類。

假設咱們有兩個產品接口Phone和Computer,每一種產品都支持多種系列,好比Apple和Huawei系列。這樣每一個系列的產品分別是Iphone、Huawei、MacBook、MateBook。爲了能夠在運行時刻建立一個系列的產品族,咱們能夠爲每一個系列的產品族建立一個工廠 AppleFactory和 HuaweiFactory。每一個工廠都有兩個方法 getPhone 和 getComputer 並返回對應的產品,能夠將這兩個方法抽象成一個接口 AbstractFactory 。這樣在運行時刻咱們能夠選擇建立須要的產品系列。

具體代碼:

AbstractFactory:

public abstract class AbstractFactory {
    public abstract Phone getPhone();

    public abstract Computer getComputer();
}

AppleFactory:

public class AppleFactory extends AbstractFactory {
    public Phone getPhone() {
        return new Iphone();
    }

    public Computer getComputer() {
        return new MacBook();
    }
}

HuaweiFactory:

public class HuaweiFactory extends AbstractFactory {
    public Phone getPhone() {
        return new Huawei();
    }

    public Computer getComputer() {
        return new MateBook();
    }
}

小結:

優勢

  • 新增一種產品類時,只須要增長相應的具體產品類和相應的工廠子類便可;
  • 不使用靜態工廠方法,能夠造成基於繼承的等級結構
  • 更符合開-閉原則,新增一種產品類時,只須要增長相應的具體產品類和相應的工廠子類便可
  • 符合單一職責原則,每一個具體工廠類只負責建立對應的產品

最後總結一下工廠方法模式和抽象工廠模式的區別:

  • 工廠方法模式利用繼承,抽象工廠模式利用組合
  • 工廠方法模式產生一類對象,抽象工廠模式產生一族對象
  • 工廠方法模式利用子類創造對象,抽象工廠模式利用接口的實現創造對象
相關文章
相關標籤/搜索