定義
抽象工廠模式提供了一個創建一系列相關或者相互依賴對象的接口,無需指定它們具體的類。
瞭解產品族概念
在開始看例子之前,得先知道產品族這個概念。
由這個圖可以看出,小米手機和小米路由器是一個產品族,知道了這個概念下面就好理解了。
例子詳解抽象工廠模式
咱們先來看一個UML類圖。
1、ProductA,咱們讓它爲手機產品接口。ProductB,爲路由器產品接口。
2、ProductA1爲小米手機實現了手機產品接口,ProductA2爲華爲手機實現了手機產品接口。
3、ProductB1爲小米路由器實現了路由器產品接口,ProductB2爲華爲路由器實現了路由器產品接口。
4、Creator爲抽象產品工廠接口,接口中有兩個方法,一個生產手機,一個生產路由器。
5、ConcreteCreator1爲小米系列產品(也就是小米產品族:這裏包含小米手機與小米路由器)的生產。ConcreteCreator2爲華爲系列產品(也就是華爲產品族:這裏包含華爲手機與華爲路由器)的生產。
理解了上面的描,再來看具體的代碼,如果不理解,就多看幾遍,多看幾遍,多看幾遍。
//手機產品接口
public interface IphoneProduct {
void start();
void shutdown();
void callup();
void sendSMS();
}
//路由器產品接口
public interface IRouterProduct {
void start();
void shutdown();
void openWife();
void setting();
}
//小米手機實現手機接口
public class XiaoMiPhone implements IphoneProduct {
@Override
public void start() {
System.out.println("開啓小米手機");
}
@Override
public void shutdown() {
System.out.println("關閉小米手機");
}
@Override
public void callup() {
System.out.println("小米打電話");
}
@Override
public void sendSMS() {
System.out.println("小米發短信");
}
}
//華爲手機實現手機接口
public class HuaweiPhone implements IphoneProduct {
@Override
public void start() {
System.out.println("開啓華爲手機");
}
@Override
public void shutdown() {
System.out.println("關閉華爲手機");
}
@Override
public void callup() {
System.out.println("華爲打電話");
}
@Override
public void sendSMS() {
System.out.println("華爲發短信");
}
}
//小米路由器實現路由器接口
public class XiaoMiRouter implements IRouterProduct{
@Override
public void start() {
System.out.println("啓動小米路由器");
}
@Override
public void shutdown() {
System.out.println("關閉小米路由器");
}
@Override
public void openWife() {
System.out.println("打開小米Wifi");
}
@Override
public void setting() {
System.out.println("小米設置");
}
}
//華爲路由器實現路由器接口
public class HuaweiRouter implements IRouterProduct{
@Override
public void start() {
System.out.println("啓動華爲路由器");
}
@Override
public void shutdown() {
System.out.println("關閉華爲路由器");
}
@Override
public void openWife() {
System.out.println("打開華爲Wifi");
}
@Override
public void setting() {
System.out.println("華爲設置");
}
}
//抽象產品工廠
public interface IProductFactory {
//生產手機
IphoneProduct iphoneProduct();
//生產路由器
IRouterProduct routerProduct();
}
//小米工廠實現抽象產品工廠(生產小米產品族產品)
public class XiaoMiFactory implements IProductFactory {
@Override
public IphoneProduct iphoneProduct() {
return new XiaoMiPhone();
}
@Override
public IRouterProduct routerProduct() {
return new XiaoMiRouter();
}
}
//華爲工廠實現抽象產品工廠(生產華爲產品族產品)
public class HuaweiFactory implements IProductFactory {
@Override
public IphoneProduct iphoneProduct() {
return new HuaweiPhone();
}
@Override
public IRouterProduct routerProduct() {
return new HuaweiRouter();
}
}
來測試一下:
public class Client {
public static void main(String[] args) {
System.out.println("================小米系列產品================");
//小米工廠
XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
IphoneProduct iphoneProduct = xiaoMiFactory.iphoneProduct();
iphoneProduct.callup();
iphoneProduct.sendSMS();
IRouterProduct iRouterProduct = xiaoMiFactory.routerProduct();
iRouterProduct.openWife();
System.out.println("================華爲系列產品================");
HuaweiFactory huaweiFactory = new HuaweiFactory();
iphoneProduct = huaweiFactory.iphoneProduct();
iphoneProduct.callup();
iphoneProduct.sendSMS();
iRouterProduct = huaweiFactory.routerProduct();
iRouterProduct.openWife();
}
}
看一下結果:
//運行結果:
================小米系列產品================
小米打電話
小米發短信
打開小米Wifi
================華爲系列產品================
華爲打電話
華爲發短信
打開華爲Wifi
看到這你已經懂抽象工廠模式了。
如果還是有點模糊,再看一遍,自己畫個圖更好理解一下!
沒有什麼是再來一遍理解不了的!
小結
抽象工廠模式不可以增加產品,可以增加產品族。
適用場景:
- 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
- 強調一系列相關的產品對象(屬於同意產品族)一起使用創建對象需要大量的重複代碼。
- 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使得客戶端不依賴於具體的實現。
優點:
- 具體產品在應用層的代碼隔離,無需關心創建的細節。
- 將一個系列的產品統一到一起創建。
缺點:
- 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難。
- 增加了系統的抽象性和理解難度。
適用場景:
- 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
- 強調一系列相關的產品對象(屬於同意產品族)一起使用創建對象需要大量的重複代碼。
- 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使得客戶端不依賴於具體的實現。
優點:
- 具體產品在應用層的代碼隔離,無需關心創建的細節。
- 將一個系列的產品統一到一起創建。
缺點:
- 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難。
- 增加了系統的抽象性和理解難度。