在前面一章博主介紹了簡單工廠模式(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(); } }