設計模式-抽象工廠模式(Abstract Factory)
阿新 • • 發佈:2018-11-24
概述
-
定義 : 抽象工廠提供一個建立一系列相關或相互依賴物件的介面
-
無需指定它們具體的類
-
型別 : 建立型設計模式
適用場景
- 客戶端不依賴於產品例項如何被建立, 實現等細節
- 強調一系列相關的產品物件(屬於同一產品組)一起使用建立物件需要大量重複的程式碼
- 提供一個產品類多的庫, 所有的產品已同樣的接口出現, 從而使客戶端端不依賴於具體實現
優點
- 具體產品在應用層程式碼隔離, 無需關心建立細節
- 將一個系列的產品族統一到一起建立
缺點
- 規定了所有可能被建立的產品集合, 產品族中擴充套件新的產品困難, 需要修改抽象工廠的介面
- 增加了系統的抽象性和理解難度
產品等級結構與產品族
模式角色
- AbstractFactory : 宣告一個建立抽象產品物件的操作介面
- ConcreteFactory : 實現建立具體產品物件的操作
- AbstractProduct : 為一類產品物件宣告一個介面
- ConcreteProduct : 定義一個將被相應的具體工廠建立的產品物件; 實現AbstractProduct介面
- Client : 客戶端, 僅使用由AbstractFactory 和AbstractProduct 類宣告的介面
程式碼演示
場景 :
以在KFC點餐為場景, 有兩種套餐, 套餐A和套餐B, 每一種套餐都包含一種飲料和一種食物,這個場景中角色對應如下 :
- KFC就相當於模式中中的AbstractFactory角色,
- 而套餐A和套餐B就相當於模式中的ConcreteFactory 角色, 是抽象工廠的實現
- 食物和飲料對應的就是模式中的AbstractProduct抽象產品
- 食物和飲料的實現類就對應模式中的ConcreteProduct,
- 假如套餐A包含可樂和漢堡, 套餐B包含薯條和果汁; 那麼可樂和漢堡就是一個產品族, 薯條和果汁也是一個產品族, 同樣的可樂和果汁是一個產品等級, 薯條和漢堡是一個產品等級
UML類圖如下 :
程式碼如下:
KFC類, 對應AbstractFactory :
/**
* 餐廳工廠介面
* 可以使用介面或者抽象類實現
* @author 七夜雪
* @create 2018-11-22 15:01
*/
public interface KFCFactory {
public Drink getDrink();
public Food getFood();
}
套餐A和套餐B程式碼, 對應ConcreteFactory :
/**
* 套餐A工廠類-包含可樂和漢堡
*
* @author 七夜雪
* @create 2018-11-22 15:15
*/
public class ProductAFactory implements KFCFactory {
@Override
public Drink getDrink() {
return new Cola();
}
@Override
public Food getFood() {
return new Hamburger();
}
}
/**
* 套餐B工廠類-包含薯條和果汁
*
* @author 七夜雪
* @create 2018-11-22 15:16
*/
public class ProductBFactory implements KFCFactory {
@Override
public Drink getDrink() {
return new Juice();
}
@Override
public Food getFood() {
return new Chip();
}
}
食物和飲料介面對應AbstractProduct :
/**
* 食物介面
* 可以使用介面或者抽象類
* @author 七夜雪
* @create 2018-11-22 15:03
*/
public interface Food {
public void produce();
}
/**
* 飲料介面
* 可以使用介面或者抽象類
* @author 七夜雪
* @create 2018-11-22 15:02
*/
public interface Drink {
public void produce();
}
食物和飲料實現類, 對應ConcreteProduct:
/**
* Food實現類-漢堡
*
* @author 七夜雪
* @create 2018-11-22 15:12
*/
public class Hamburger implements Food {
@Override
public void produce() {
System.out.println("獲得漢堡包一個...");
}
}
/**
* Food實現類-薯條
*
* @author 七夜雪
* @create 2018-11-22 15:13
*/
public class Chip implements Food {
@Override
public void produce() {
System.out.println("獲得薯條一包...");
}
}
/**
* 飲料實現類-可樂
*
* @author 七夜雪
* @create 2018-11-22 15:10
*/
public class Cola implements Drink {
@Override
public void produce() {
System.out.println("獲得可樂一聽...");
}
}
/**
* 飲料實現類-果汁
*
* @author 七夜雪
* @create 2018-11-22 15:11
*/
public class Juice implements Drink {
@Override
public void produce() {
System.out.println("獲得果汁一杯...");
}
}
測試類, 對應Client:
/**
* 抽象工廠測試類
* @author 七夜雪
* 2018/11/14 10:04
*/
public class Client {
public static void main(String[] args) {
// 獲取套餐A
KFCFactory factory1 = new ProductAFactory();
factory1.getFood().produce();
factory1.getDrink().produce();
// 獲取套餐B
KFCFactory factory2 = new ProductBFactory();
factory2.getFood().produce();
factory2.getDrink().produce();
}
}
本文參考:
慕課網<java設計模式精講 Debug 方式+記憶體分析>課程
四人幫<設計模式>