1. 程式人生 > >淺談Java設計模式——抽象工廠模式(AbstractFactory)

淺談Java設計模式——抽象工廠模式(AbstractFactory)

一、對比簡單工廠模式、工廠方法模式

        簡單工廠模式只通過一個工廠類,通過給定引數返回相應的例項物件。工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。 工廠方法模式的具體工廠類只能建立一個具體產品類的例項,而抽象工廠模式可以建立多個。 普通工廠產出是一個產品(例項),抽象工廠產出是一個抽象(介面)

二、概述

        提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

三、使用場景

        為什麼工廠模式是如此常用?因為工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如A a=new A() 工廠模式也是用來建立例項物件的,所以以後new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。

1.一個系統要獨立於它的產品的建立、組合和表示時。 2.一個系統要由多個產品系列中的一個來配置時。  3.當你要強調一系列相關的產品物件的設計以便進行聯合使用時。 4.當你提供一個產品類庫,而只想顯示它們的介面而不是實現時。  

四、參與者

1.AbstractFactory 宣告一個建立抽象產品物件的操作介面。  2.ConcreteFactory 實現建立具體產品物件的操作。  3.AbstractProduct 為一類產品物件宣告一個介面。 4.ConcreteProduct 定義一個將被相應的具體工廠建立的產品物件。 實現AbstractProduct介面。  5.Client 僅使用由AbstractFactory和AbstractProduct類宣告的介面

四、類圖

五、程式碼實現

AbstractProduct(抽象產品):定義抽象工廠中要生產的抽象產品介面ICat和IDog

public interface IDog {
    void describe();
}
public interface ICat {
    void describe();
}

ConcreteProduct(具體產品):建立產品的實現類IDog、BlackDog、WhiteDog;ICat、BlackCat、WhiteCat

public class BlackDog implements IDog {
    @Override
    public void describe() {
        System.out.println("describe class and method: this black dog ...");
    }
}
public class BlackCat implements ICat {
    @Override
    public void describe() {
        System.out.println("describe class and method: this black cat ...");
    }
}
public class WhiteCat implements ICat {
    @Override
    public void describe() {
        System.out.println("describe class and method: this white cat ...");
    }
}

AbstractFactory:定義抽象工程類IAnimalFactory

public interface IAnimalFactory {
    IDog createDog();

    ICat createCat();
}

 ConcreteFactory:建立抽象工廠類的兩個實現類,WhiteAnimalFactory和BlackAnimalFactory

public class BlackAnimalFactory implements IAnimalFactory{
    @Override
    public IDog createDog() {
        return new BlackDog();
    }

    @Override
    public ICat createCat() {
        return new BlackCat();
    }
}
public class WhiteAnimalFactory implements IAnimalFactory {
    @Override
    public IDog createDog() {
        return new WhiteDog();
    }

    @Override
    public ICat createCat() {
        return new WhiteCat();
    }
}

六、總結

          工廠方法確實為系統結構提供了非常靈活強大的動態擴充套件機制,只要我們更換一下具體的工廠方法,系統其他地方無需一點變換,就有可能將系統功能進行改頭換面的變化。