JAVA設計模式系列:
抽象工廠模式
定義
抽象工廠模式是圍繞一個超級工廠創(chuàng)建其他工廠擅腰。該超級工廠又稱為其他工廠的工廠筷屡。在抽象工廠中搬瑰,接口是負責創(chuàng)建相關對象的工廠,不需要顯示指定他們的類档桃。提供了一種創(chuàng)建對象的最佳方式往产。
角色
抽象工廠類:具體工廠必須實現(xiàn)或繼承的父類,在
Java
中可以用抽象類或者接口實現(xiàn)奏属。具體工廠類:負責創(chuàng)建具體對象的類,包含具體的業(yè)務邏輯潮峦。
抽象產(chǎn)品類:工廠類所創(chuàng)建對象實例的父類囱皿。
具體產(chǎn)品類:工廠類創(chuàng)建的具體對象實例勇婴。
實現(xiàn)
這里簡單寫一個示例來實現(xiàn)抽象工廠模式。
類圖

- 這個類圖描述的是抽象產(chǎn)品類與具體產(chǎn)品類之間的關系嘱腥,從圖中我們可以看出我們分別有
IOrange
和IApple
兩個接口耕渴,每個接口都有對應2個具體的實現(xiàn)類CNOrange
、USOrange
和USApple
齿兔、CNApple
橱脸。這里就構成了我們的抽象產(chǎn)品類與具體產(chǎn)品類。

- 這個類圖描述抽象工廠類與具體工廠類之間的關系分苇。抽象工廠類
AbstractFactory
分別有2個方法getApple
添诉、getOrange
,交于具體工廠類CNFactory
医寿、USFactory
實現(xiàn)具體邏輯吻商。
抽象產(chǎn)品類
public interface IApple {
void get();
}
public interface IOrange {
void get();
}
具體產(chǎn)品類
public class CNApple implements IApple {
public void get() {
System.out.println("我是中國蘋果。");
}
}
public class CNOrange implements IOrange {
public void get() {
System.out.println("我是中國橙子糟红。");
}
}
public class USApple implements IApple {
public void get() {
System.out.println("我是美國蘋果。");
}
}
public class USOrange implements IOrange {
public void get() {
System.out.println("我是美國橙子乌叶。");
}
}
定義了4個具體對象實例類盆偿。
抽象工廠類
public interface AbstractFactory {
IApple getApple();
IOrange getOrange();
}
具體工廠類
public class USFactory implements AbstractFactory {
public IApple getApple() {
return new USApple();
}
public IOrange getOrange() {
return new USOrange();
}
}
public class CNFactory implements AbstractFactory {
public IApple getApple() {
return new CNApple();
}
public IOrange getOrange() {
return new CNOrange();
}
}
測試
public static void main(String[] args) {
AbstractFactory usFactory = new USFactory();
AbstractFactory cnFactory = new CNFactory();
usFactory.getApple().get();
usFactory.getOrange().get();
cnFactory.getApple().get();
cnFactory.getOrange().get();
}
運行結果:
我是美國蘋果。
我是美國橙子准浴。
我是中國蘋果事扭。
我是中國橙子。
總結
優(yōu)點:可以將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建乐横;
缺點:在產(chǎn)品族中擴展新的產(chǎn)品是很困難的求橄,它需要修改抽象工廠的接口;