1. 程式人生 > >設計模式-抽象工廠模式(Abstract Factory)

設計模式-抽象工廠模式(Abstract Factory)

概述

  • 定義 : 抽象工廠提供一個建立一系列相關或相互依賴物件的介面

  • 無需指定它們具體的類

  • 型別 : 建立型設計模式

適用場景

  • 客戶端不依賴於產品例項如何被建立, 實現等細節
  • 強調一系列相關的產品物件(屬於同一產品組)一起使用建立物件需要大量重複的程式碼
  • 提供一個產品類多的庫, 所有的產品已同樣的接口出現, 從而使客戶端端不依賴於具體實現

優點

  • 具體產品在應用層程式碼隔離, 無需關心建立細節
  • 將一個系列的產品族統一到一起建立

缺點

  • 規定了所有可能被建立的產品集合, 產品族中擴充套件新的產品困難, 需要修改抽象工廠的介面
  • 增加了系統的抽象性和理解難度

產品等級結構與產品族

1542859325680

1542859458233

模式角色

  • 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 方式+記憶體分析>課程
四人幫<設計模式>