设计模式之工厂方法模式

工厂方法属创建型类模式,也称虚构造器/多态性工厂模式,工厂方法使得一个类的实例化延迟到其子类。在简单工厂模式中,产品的创建由静态工厂方法做出判断并返回相应的的对象,缺点就是当我们要添加新的类并希望创建新的对象的时候,我们需要修改静态工厂方法,有没有那种只添加新功能而不修改系统有原有功能的方案呢?当然有了,工厂方法就是一个解决方案。

还是以生产水果为例,静态工厂方法模式中只有一个生产窗口(也就是静态工厂方法),这个生产窗口生产它所能提供的一切水果,如果客户有新需求,就要对该窗口添加新的创建方法,显然要对原系统进行修改;而工厂方法提供的管理模式更加精细化,它会创建许多窗口,每个窗口各施其职,例如生产苹果有生产品苹果的窗口,生产橘子有生产橘子的窗口,如果客户需要的水果不存在,我们只需创建这个水果类以及生产该水果的新窗口即可, 我们并未对原系统中的其他窗口做出任何修改,这对设计模式的“开-闭原则”起到了很好的支持。同样,为了方便起见,这里将所有代码均放到与测试类同一个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 }
View Code

代码给出的实例中只有AppleCreator和GrapeCreator两个生产窗口,当我们需要创建新的水果比如橘子时,我们可以添加实现了Fruit接口的橘子类,同时创建一个实现了Creator的新窗口OrangeCreator类,这样生产橘子就只需创建OrangeCreator并调用factory()方法即可,我们并未对原系统代码做任何修改,我们只添加了一些新的类,但是使系统的功能更加强大。

在Java中,实现Collection接口的集合类都包含有一个iterator()方法,该方法返回一个具体的Iterator类对象,这就是工厂方法的一个应用。工厂方法虽然已经完全支持了“开-闭原则”,但其功能还是有限,下次再总结它与抽象工厂的区别。

原文地址:https://www.cnblogs.com/codeMedita/p/6935705.html