AbstractFactoryPattern抽象工廠模式

抽象工廠模式

1.定義

爲建立一組相關或相互依賴的對象提供一個接口,並且無需指定它們的具體類。java

以女媧造人爲例,定義人種(Product產品類)及八卦爐(工廠類)。爲人類定義膚色及性別屬性,從設計角度看,一個具體的對象能夠經過膚色及性別肯定。生產的工廠類若是隻有一個,生產出來的全都是男性或者女性,所以須要拆分爲兩個工具類。windows

人類接口編輯器

public interface Human {
    // 每一個人都有膚色	
    void getColor();
    // 每一個人都有性別
    void getSex();
}

抽象人種類(根據膚色劃分)工具

/*
 * 白色人種
 */
public abstract class AbstractWhiteHuman implements Human {
    public void getColor() {
      	System.out.println("白色人種皮膚是白色的")
    }
}

/*
 * 黑色人種
 */
public abstract class AbstractBlackHuman implements Human {
    public void getColor() {
      	System.out.println("黑色人種皮膚是黑色的")
    }
}

/*
 * 黃色人種
 */
public abstract class AbstractYellowHuman implements Human {
    public void getColor() {
      	System.out.println("黃色人種皮膚是黃色的")
    }
}

具體人類(產品類實現類),每一個抽象類都有兩個實現類(男人和女人),實現性別的定義,以黃色人種爲例操作系統

public class FemaleYellowHuman extends AbstractYellowHuman {
    public void getSex() {
      	System.out.println("女性黃種人")
    }
}

public class MaleYellowHuman extends AbstractYellowHuman {
    public void getSex() {
      	System.out.println("男性黃種人")
    }
}

其它的黑色人種與白色人種的代碼與此相似,再也不重複編寫。到此全部的人種(產品類)已定義完畢,接下來須要定義八卦爐(工廠類)生產人類。設計

八卦爐接口unix

public interface HumanFactory {
    Human createYelloHuman();
  
    Human createBlackHuman();
  
    Human createWhiteHuman();
}

具體八卦爐(工廠實現類),按性別分爲男性八卦爐及女性八卦爐code

public class FemaleFactory implements HumanFactory {
    public Human createYelloHuman() {
      	return new FemaleYelloHuman();
    }
  
    public Human createBlackHuman() {
      	return new FemaleBlackHuman();
    }
  
    public Human createWhiteHuman() {
      	return new FemaleWhiteHuman();
    }
}

public class MaleFactory implements HumanFactory {
    public Human createYelloHuman() {
      	return new MaleYelloHuman();
    }
  
    public Human createBlackHuman() {
      	return new MaleBlackHuman();
    }
  
    public Human createWhiteHuman() {
      	return new MaleWhiteHuman();
    }
}

造人(場景類)視頻

public class Client {
    public static void main(String[] args) {
      	HumanFactory maleHumanFactory = new MaleFactory();
      	HumanFactory femaleHumanFactory = new FemaleFactory();
        
      	Human maleYellowHuman = maleHumanFactory.createYelloHuman();
        Human maleBlackHuman = maleHumanFactory.createBlackHuman();
      	Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();
      
      	Human femaleYellowHuman = femaleHumanFactory.createYelloHuman();
        Human femaleBlackHuman = femaleHumanFactory.createBlackHuman();
      	Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();
    }
}

抽象工廠模式是工廠方法模式的升級,在有多個業務品種,業務分類時,經過抽象工廠模式產生須要的對象。若是將八卦爐(工廠類)比喻爲車間,那八卦爐的類型(人種性別)能夠稱做產品等級,八卦爐的生產工藝(人種膚色)能夠稱做產品線或產品族。抽象工廠類的職責是定義每一個工廠要實現的功能即產品線,有M個產品等級就應該有M個八卦爐(工廠實現類),有N個產品線,在八卦爐(抽象工廠類)中就應該有N個生產線(建立方法)。在場景類中,沒有任何一個方法與產品實現類有關係,對於一個產品來講,只須要知道它的工廠方法就能夠直接生產一個產品對象,無需關心它的實現類。對象

2.應用

2.1 優勢

  • 封裝性。每一個產品的實現類不是高層模塊關心的,它關心的是接口,是抽象。只要知道工廠類,就能夠創造出一個須要的對象。

2.2 缺點

  • 產品族擴展困難。增長新的產品線,抽象工廠類須要增長新的抽象方法,且全部的工廠實現類都要修改。

2.3 使用場景

一組沒有任何關係的對象具備相同的約束,則可使用抽象工廠模式。一個視頻編輯器及音頻編輯器,在unix和windows操做系統中雖然功能和界面都相同,但代碼的實現不一樣。也就是所說的具備共同的約束條件(操做系統)。所以可以使用抽象工廠模式,產生不一樣操做系統下的視頻及音頻處理器。

2.4 注意事項

在抽象工廠模式的缺點中所說的是產品族擴展困難,而不是產品等級擴展困難。擴展產品等級只須要增長一個新的工廠實現類便可,也就是橫向擴展容易,縱向擴展困難。

相關文章
相關標籤/搜索