工厂方法属创建型类模式,也称虚构造器/多态性工厂模式,工厂方法使得一个类的实例化延迟到其子类。在简单工厂模式中,产品的创建由静态工厂方法做出判断并返回相应的的对象,缺点就是当我们要添加新的类并希望创建新的对象的时候,我们需要修改静态工厂方法,有没有那种只添加新功能而不修改系统有原有功能的方案呢?当然有了,工厂方法就是一个解决方案。
还是以生产水果为例,静态工厂方法模式中只有一个生产窗口(也就是静态工厂方法),这个生产窗口生产它所能提供的一切水果,如果客户有新需求,就要对该窗口添加新的创建方法,显然要对原系统进行修改;而工厂方法提供的管理模式更加精细化,它会创建许多窗口,每个窗口各施其职,例如生产苹果有生产品苹果的窗口,生产橘子有生产橘子的窗口,如果客户需要的水果不存在,我们只需创建这个水果类以及生产该水果的新窗口即可, 我们并未对原系统中的其他窗口做出任何修改,这对设计模式的“开-闭原则”起到了很好的支持。同样,为了方便起见,这里将所有代码均放到与测试类同一个Java文件中,代码如下:
1 package factoryMethod; 2 public class Test{ 3 private static Creator applecreator,grapecreator; 4 private static Fruit apple,grape; 5 public static void main(String[] args){ 6 applecreator=new AppleCreator(); 7 apple=applecreator.factory(); 8 grapecreator=new GrapeCreator(); 9 grape=grapecreator.factory(); 10 apple.color(); 11 grape.color(); 12 } 13 } 14 interface Creator{ 15 public Fruit factory(); 16 } 17 interface Fruit{ 18 public void taste(); 19 public void color(); 20 } 21 class Apple implements Fruit{ 22 public void taste(){ 23 System.out.println("I'm Sweet"); 24 } 25 public void color(){ 26 System.out.println("I'm Red"); 27 } 28 } 29 class Grape implements Fruit{ 30 31 public void taste(){ 32 System.out.println("I'm Sour"); 33 } 34 public void color(){ 35 System.out.println("I'm Purple"); 36 } 37 } 38 class AppleCreator implements Creator{ 39 public Fruit factory(){ 40 return new Apple(); 41 } 42 }class GrapeCreator implements Creator{ 43 public Fruit factory(){ 44 return new Grape(); 45 } 46 }
代码给出的实例中只有AppleCreator和GrapeCreator两个生产窗口,当我们需要创建新的水果比如橘子时,我们可以添加实现了Fruit接口的橘子类,同时创建一个实现了Creator的新窗口OrangeCreator类,这样生产橘子就只需创建OrangeCreator并调用factory()方法即可,我们并未对原系统代码做任何修改,我们只添加了一些新的类,但是使系统的功能更加强大。
在Java中,实现Collection接口的集合类都包含有一个iterator()方法,该方法返回一个具体的Iterator类对象,这就是工厂方法的一个应用。工厂方法虽然已经完全支持了“开-闭原则”,但其功能还是有限,下次再总结它与抽象工厂的区别。