[design pattern](5) Factory Method

前言

在前面一章博主介紹了簡單工廠模式(Simple Factory),接着上面的章節,今天博主就來介紹下工廠方法模式(Factory Method)。java

思考題

首先,讓咱們來思考下面的問題:ide

在上一章的內容中咱們提到了,博主開了一家飯店,那麼,由於經營有方,博主準備在四川和上海開飯店了,也仍是那兩個菜,你們都知道上海和四川的口味差距很是的大,上海口味偏甜,那麼四川口味偏辣。因此爲了迎合當地人的口味,咱們須要作不一樣口味的菜。那麼大家會怎麼作呢?

 這時咱們若是在原有的簡單工廠上添加不一樣口味的菜,就會違背‘開放-關閉’原則,那麼接下來就讓我來隆重介紹工廠方法模式。測試

工廠方法模式

定義:定義一個建立產品的工廠的接口,將具體的產品的建立推遲到工廠子類中,符合‘開發-關閉’原則。spa

類圖:設計

 

上面的類圖,設計如下的幾個角色:code

  • 抽象產品:爲一類產品定義了統一接口。將具體實現與用戶解耦。
  • 具體產品:實現了抽象產品定義的接口,不一樣的產品有不一樣的實現。
  • 抽象工廠:爲一類工廠定義了統一接口。
  • 具體工廠:實現了抽象工廠定義的方法,用來建立具體的產品。

思考題實現

首先,定義一個抽象產品類:blog

Food.java:接口

public interface Food {
    void fry();
    void putSeasoning();
    void eat();
}

 

而後,實現具體的產品:開發

ShangHaiKungPaoChicken.java:產品

public class ShangHaiKungPaoChicken implements Food {
    @Override
    public void fry() {
        System.out.println("上海,炒宮保雞丁!!!");
    }

    @Override
    public void putSeasoning() {
        System.out.println("上海,加入宮保雞丁做料!!!");
    }

    @Override
    public void eat() {
        System.out.println("上海,吃宮保雞丁!!!");
    }
}

 

ShanghaiTomatoEgg.java:

public class ShangHaiTomatoEgg implements Food {
    @Override
    public void fry() {
        System.out.println("上海,炒西紅柿炒蛋!!!");
    }

    @Override
    public void putSeasoning() {
        System.out.println("上海,放入西紅柿炒蛋做料!!!");
    }

    @Override
    public void eat() {
        System.out.println("上海,吃西紅柿炒蛋!!!");
    }
}

 

SiCHuanKungPaoChicken.java:

public class SiChuanKungPaoChicken implements Food {
    @Override
    public void fry() {
        System.out.println("四川,炒宮保雞丁!!!");
    }

    @Override
    public void putSeasoning() {
        System.out.println("四川,加入宮保雞丁做料!!!");
    }

    @Override
    public void eat() {
        System.out.println("四川,吃宮保雞丁!!!");
    }
}

 

SiChuanTomatoEgg.java:

public class SiChuanTomatoEgg implements Food {
    @Override
    public void fry() {
        System.out.println("四川,炒西紅柿炒蛋!!!");
    }

    @Override
    public void putSeasoning() {
        System.out.println("四川,放入西紅柿炒蛋做料!!!");
    }

    @Override
    public void eat() {
        System.out.println("四川,吃西紅柿炒蛋!!!");
    }
}

 

再而後,定義一個抽象工廠接口:

AbstractHotal.java:

public abstract class AbstractHotal {
    public Food saleFood(String foodName) {
        Food food = createFood(foodName);

    food.putSeasoning();
    food.fry();
    return food;
    }

    public abstract Food createFood(String foodName);
}

 

再而後,實現抽象工廠:

ShangHaiHotal.java:

public class ShangHaiHotal extends AbstractHotal {
    @Override
    public Food createFood(String foodName) {
        switch(foodName) {
        case "KungPaoChicken": 
            return new ShangHaiKungPaoChicken();
        case "TomatoEgg":
            return new ShangHaiTomatoEgg();
        default:
            return null;
    }
    }
}

 

SiChuanHotal.java:

public class SiChuanHotal extends AbstractHotal {
    @Override
    public Food createFood(String foodName) {
        switch(foodName) {
        case "KungPaoChicken":
            return new SiChuanKungPaoChicken();
        case "TomatoEgg":
            return new SiChuanTomatoEgg();
        default:
            return null;
    }
    }
}

 

 

下面是個人測試類:

Custom.java:

public class Custom {
    public static void main(String ...args) {
        ShangHaiHotal shangHaiHotal = new ShangHaiHotal();
    SiChuanHotal siChuanHotal = new SiChuanHotal();

    Food shangHaiKungPaoChicken = shangHaiHotal.saleFood("KungPaoChicken");
    Food shangHaiTomatoEgg = shangHaiHotal.saleFood("TomatoEgg");
    shangHaiKungPaoChicken.eat();
    shangHaiTomatoEgg.eat();

    Food siChuanKungPaoChicken = siChuanHotal.saleFood("KungPaoChicken");
    Food siChuanTomatoEgg = siChuanHotal.saleFood("TomatoEgg");
    siChuanKungPaoChicken.eat();
    siChuanTomatoEgg.eat();
    }
}
相關文章
相關標籤/搜索