工厂模式涉及到以下的角色
抽象工厂(AbstractFactory)类或接口
担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创立对象的工厂类必须实现这个接口,或继承这个类。
实工厂类 (Conrete Factory)
担任这个角色的是与应用程序紧密相关的,直接在应用程序调用下,创立产品实例的那样一些类。
抽象产品 (Abstract Product)
担任这个角色的类是工厂方法模式所创立的对象的父类,或它们共同拥有的接口。
实产品 (Concrete Product)
担任这个角色的类是工厂方法模式所创立的任何对象所属的类。
在以下情况下,应当考虑使用抽象工厂模式:
首先,一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。
其次,这个系统的产品有多于一个的产品族。
第三,同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来。
最后,不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节。
其中第二丶第三个条件是我们选用抽象工厂模式而非其它形态的工厂模式的关键性条件。
1 package com.javapatterns.factorymethod; 2 3 abstract public class Gardener 4 { 5 public abstract PlantIF factory(String which) 6 throws BadFruitException; 7 } 8 class VeggieGardener extends Gardener 9 { 10 public PlantIF factory(String which) 11 throws BadPlantException 12 { 13 if (which.equalsIgnoreCase("tomato")) 14 { 15 return new Tomato(); 16 } 17 else if (which.equalsIgnoreCase("potato")) 18 { 19 return new Potato(); 20 } 21 else if (which.equalsIgnoreCase("broccoli")) 22 { 23 return new Broccoli(); 24 } 25 else 26 { 27 throw new BadPlantException("Bad veggie request"); 28 } 29 } 30 } 31 class FruitGardener extends Gardener 32 { 33 public PlantIF factory(String which) 34 { 35 if (which.equalsIgnoreCase("apple")) 36 { 37 return new Apple(); 38 } 39 else if (which.equalsIgnoreCase("strawberry")) 40 { 41 return new Strawberry(); 42 } else if (which.equalsIgnoreCase("grape")) 43 { 44 return new Grape(); 45 } 46 else 47 { 48 throw new BadPlantException("Bad fruit request"); 49 } 50 } 51 } 52 class Broccoli implements VeggieIF, PlantIF 53 { 54 public void grow() 55 { 56 log("Broccoli is growing..."); 57 } 58 public void harvest() 59 { 60 log("Broccoli has been harvested."); 61 } 62 public void plant() 63 { 64 log("Broccoli has been planted."); 65 } 66 private static void log(String msg) 67 { 68 System.out.println(msg); 69 } 70 public void pesticideDust() 71 { 72 73 } 74 75 class Apple implements FruitIF, PlantIF 76 { 77 public void grow() 78 { 79 log("Apple is growing..."); 80 } public void harvest() 81 { 82 log("Apple has been harvested."); 83 } 84 public void plant() 85 { 86 log("Apple has been planted."); 87 } 88 private static void log(String msg) 89 { 90 System.out.println(msg); 91 } 92 public int getTreeAge() 93 { 94 return treeAge; 95 } 96 public void setTreeAge(int treeAge) 97 { 98 this.treeAge = treeAge; 99 } 100 private int treeAge; 101 } 102 }