淺談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();
}
}
六、總結
工廠方法確實為系統結構提供了非常靈活強大的動態擴充套件機制,只要我們更換一下具體的工廠方法,系統其他地方無需一點變換,就有可能將系統功能進行改頭換面的變化。