1. 程式人生 > 其它 >Java設計模式之抽象工廠模式

Java設計模式之抽象工廠模式

針對工廠方法的問題,當有多個產品等級時(食物、飲料、甜品。。。) 工廠類就會很多。抽象工廠模式對該問題進行了優化。

抽象工廠的優點:

  • 仍然有工廠模式和簡單工廠模式的優點。
  • 抽象工廠把工廠類的數量減少了,無論有多少個產品等級,工廠就一套。

抽象工廠的缺點:

  • 當產品等級(食物、飲料)發生變化時(增加產品等級,刪除產品等級),都要引起以前工廠程式碼的修改(動一發牽全域性),違反了ocp原則。

當產品等級比較固定時,可以使用抽象工廠。

package com.fjh.factory.simplefactory.abstractfactory;

interface Food{
    void eat();
}

interface Drink{
    void drink();
}

class Hamburger implements Food {

    @Override
    public void eat() {
        System.out.println("吃漢堡");
    }
}

class Cola implements Drink{

    @Override
    public void drink() {
        System.out.println("喝可樂");
    }
}

interface Factory{
    Food getFood();
    Drink getDrink(); //與工廠方法的最大區別之處(多個產品等級),因此得名抽象工廠。
}

class KFCFactory implements Factory {

    @Override
    public Food getFood() {
        return new Hamburger();
    }

    @Override
    public Drink getDrink() {
        return new Cola();
    }
}

class Rise implements Food {

    @Override
    public void eat() {
        System.out.println("吃飯");
    }
}

class XueBi implements Drink{

    @Override
    public void drink() {
        System.out.println("喝雪碧");
    }
}

class MFactory implements Factory {

    @Override
    public Food getFood() {
        return new Rise();
    }

    @Override
    public Drink getDrink() {
        return new XueBi();
    }
}

public class AbstractFactory {
    public static void main(String[] args){
        KFCFactory kfcFactory = new KFCFactory();
        Food food1 = kfcFactory.getFood();
        Drink drink1 = kfcFactory.getDrink();
        food1.eat();
        drink1.drink();
    }
}