转载自 http://www.javaeye.com/topic/413580#1064514
一家公司生产两个系列的产品
A系列, 食品里: milk,meat,noodle
B系列, 与A系列相对应的餐具,Spoon,Knife,Chopsticks
产品有两个系列,在A系列某个位置的产品,在B系列一定有一个对应的产品, 牛奶--汤勺, 肉-刀, 面条--筷子
抽象产品系列之一, 食品类接口与三个具体的食品类
1: package Food;
2: public interface Food {
3: public String getMyFood();
4: }
5:
6: public class Meat implements Food {
7:
8: public String getMyFood() {
9:
10: return "Meat";
11: }
12:
13: }
14:
15: public class Milk implements Food {
16:
17: public String getMyFood() {
18:
19: return "Milk";
20: }
21:
22: }
23:
24: public class Noodle implements Food {
25:
26: public String getMyFood() {
27:
28: return "Noodle";
29:
30: }
31:
32: }
抽象产品系列之二, 餐具类接口与三个具体的餐具类
1: package TableWare;
2:
3: public interface TableWare {
4: public String getMyTableWare();
5: }
6:
7: public class Knife implements TableWare {
8:
9: public String getMyTableWare() {
10: return "Knife";
11: }
12:
13: }
14:
15: public class Spoon implements TableWare {
16:
17: public String getMyTableWare() {
18: return "Spoon";
19: }
20:
21: }
22:
23: public class Chopsticks implements TableWare {
24:
25: public String getMyTableWare() {
26: return "Chopsticks";
27: }
28:
29: }
30:
抽象工厂接口,它是抽象工厂模式的核心,与具体的产品逻辑无关
1: public interface KitchenFactory {
2: public Food getFood();
3: public TableWare getTableWare();
4: }
具体工厂A,生产牛奶和它对应的汤勺
1: public class KitchenFactoryA implements KitchenFactory {
2:
3: public Food getFood() {
4:
5: return new Milk();
6: }
7:
8: public TableWare getTableWare() {
9: // TODO Auto-generated method stub
10: return new Spoon();
11: }
12:
13: }
具体工厂B,生产肉和它对应的刀子
1: public class KitchenFactoryB implements KitchenFactory {
2:
3: public Food getFood() {
4:
5: return new Meat();
6: }
7:
8: public TableWare getTableWare() {
9:
10: return new Knife();
11: }
12:
13: }
具体工厂C,生产面条和它对应的筷子
1: public class KitchenFactoryC implements KitchenFactory {
2:
3: public Food getFood() {
4:
5: return new Noodle();
6: }
7:
8: public TableWare getTableWare() {
9:
10: return new Chopsticks();
11: }
12:
13: }
在什么情形下应当使用抽象工厂模式
在以下情况下,应当考虑使用抽象工厂模式。
首先,一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。
其次,这个系统的产品有多于一个的产品族。
第三,同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来。
最后,不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节。
其中第二丶第三个条件是我们选用抽象工厂模式而非其它形态的工厂模式的关键性条件。