设计模式学习(四)抽象工厂
2013-04-23 15:12
483 查看
考虑这样的情况:食堂窗口1卖馒头与白菜,食堂窗口2卖包子与豆腐。包子与馒头属于面食,白菜与豆腐属于蔬菜类(姑且这么说吧)。怎样去封装这些内部信息才合适呢?
抽象工厂的原理图如下
面食类:
具体面食:包子馒头类:
蔬菜类:
具体蔬菜:白菜豆腐类
抽象工厂类:
窗口一:生产馒头与白菜:
窗口2:生产包子与豆腐:
客户端调用:
工厂方法与抽象工厂的区别就在于:工厂方法针对相似的产品对其进行封装,抽象工厂是几类产品,对其封装。好比家具的制作,有的工厂只负责生产木材,有的工厂只负责生产钉子,有的工厂只负责生产木门,有的工厂只负责进行家具组装,而且不同品牌的家具会有不同的制造工厂。
好吧,我也被绕晕了
PS:简单工厂由client端实现所要做的工作(包子馒头这个例子好像没有体现出来)。
工厂方法是直接在工厂中实现所要做的工作,Client端只用调用该方法。(如果在工厂方法中的工厂类添加一个sayTxt方法,简单工厂无此方法,需要在Client中进行实现)。
抽象工厂是几类产品的不同方法(showPrice与showNutrition)的封装。
抽象工厂的原理图如下
面食类:
//*******************Pasta.java************************ public interface Pasta { void showPrice(); }
具体面食:包子馒头类:
//******************Mantou.java*********************** public class Mantou implements Pasta { public void ShowPrice() { System.out.println("The Mantou is 0.5 yuan."); } } //****************Baozi.java**************************** public class Baozi implements Product { public void showPrice() { System.out.println("The Baozi is 0.8 yuan."); } }
蔬菜类:
//***************Vegetable.java************************* public interface Vegetable { void showNutrition(); }
具体蔬菜:白菜豆腐类
//*****************Baicai.java************************** public class Baicai implements Vegetable { public void showNutrition() { System.out.println("baicai has more nutrition than tofu."); } } //*********************Tofu.java**************************** public class Tofu implements Vegetable { public void showNutrition() { System.out.println("tofu has less nutrition than baicai."); } }
抽象工厂类:
//*******************FactoryMethod.java********************* public class FactoryMethod { abstract Pasta factoryMethodPrice(); abstract Vegetable factoryMethodNutrition(); void sayTxt() { Pasta pasta = factoryMethodPasta(); Vegetable vegetble = factoryMethodVegetable(); System.out.println(pasta.showPrice()+"-------"vegetable.showNutrition()); } }
窗口一:生产馒头与白菜:
//****************Factory1.java************************** public class Factory1 extends FactoryMethod { public Pasta factoryMethodPrice() { return new Mantou(); } public Vegetable factoryMethodNutrition() { return new Baicai(); } }
窗口2:生产包子与豆腐:
//*********************Factory2.java*************************** public class Factory2 extends FactoryMethod { public Pasta factoryMethodPrice() { return new Baozi(); } public Vegetable factoryMethodNutrition() { return new Tofu(); } }
客户端调用:
//******************Client.java**************************** public class Client { public static void main(String []args) { FactoryMethod factoryMethod = new Factory1(); factoryMethod.sayTxt(); factoryMethod = new Factory2(); factoryMethod.sayTxt(); } }
工厂方法与抽象工厂的区别就在于:工厂方法针对相似的产品对其进行封装,抽象工厂是几类产品,对其封装。好比家具的制作,有的工厂只负责生产木材,有的工厂只负责生产钉子,有的工厂只负责生产木门,有的工厂只负责进行家具组装,而且不同品牌的家具会有不同的制造工厂。
好吧,我也被绕晕了
PS:简单工厂由client端实现所要做的工作(包子馒头这个例子好像没有体现出来)。
工厂方法是直接在工厂中实现所要做的工作,Client端只用调用该方法。(如果在工厂方法中的工厂类添加一个sayTxt方法,简单工厂无此方法,需要在Client中进行实现)。
抽象工厂是几类产品的不同方法(showPrice与showNutrition)的封装。
相关文章推荐
- 跟着实例学习设计模式(5)-工厂方法 、抽象工厂的区别
- 设计模式学习笔记(一):抽象工厂
- 设计模式学习笔记(4)抽象工厂
- 设计模式学习1---抽象工厂
- 设计模式(三) 抽象工厂的学习和使用
- 小白学习设计模式——简单工厂、工厂方法、抽象工厂
- 设计模式学习笔记(一):抽象工厂
- 设计模式学习--抽象工厂
- 设计模式学习-每日一记(4.抽象工厂)
- IOS设计模式学习(5)抽象工厂
- “设计模式”学习之一:工厂方法与抽象工厂
- 跟着实例学习设计模式(5)-工厂方法 、抽象工厂的差别
- 学习笔记之设计模式:抽象工厂
- iOS学习笔记(5)——设计模式之工厂方法、抽象工厂
- 设计模式学习笔记(一)——Abstract Factory抽象工厂
- C#面向对象设计模式纵横谈 学习笔记3 Abstract Factory 抽象工厂
- 设计模式学习之抽象工厂
- 设计模式学习之简单工厂、工厂方法、抽象工厂
- 设计模式学习(三)抽象工厂
- 换个角度学习设计模式-抽象工厂