文章摘抄自网络
工厂模式是类的创建模式,又叫做虚拟构造(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
工厂模式在《Java与模式》中分为三类:
1)简单工厂模式(Simple Factory):不利于产生系列产品;
2)工厂方法模式(Factory Method):又称为多形性工厂;
3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
这三种模式从上到下逐步抽象,并且更具一般性。
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
一、简单工厂模式
简单工厂模式是类的创建模式,又叫静态工厂方法模式(负责创建一般产品的类事例用的是一个静态方法)。
这里有三个基本的图形,Circle,Square,Triangle而每个基本的图形都有被画和被被擦出的方法,接口Shape就定义了所有图形都同用的这两个方法,ArtTracer类提供了一个静态工厂方法,在客户端调用的情况下,返回客户端所需要的类事例,其他的代码都比较简单,这里只给出ArtTracer类的代码:
public class ArtTracer { public static Shape factory(String witch) throw BadShapeException{ if(wicth.equals("Circle"){ return new Circle(); } else if(wicth.equals("Square"){ return new Square(); } else if(wicth.equals("Triangle"){ return new Triangle(); }else{ throw new BadShapeException(witch); } } } public class BadShapeException extends Exception{ public BdaShapeException(String witch){ super(witch); } }
从上面的代码可以看出,在客户端使用的时候你只要去调用ArtTrace类的工厂方法,返回你想要的类的事例,而不需要关心内部实现以及这个类事例到底是怎样生成的,当你所调用的图形是系统不支持的时候,将会给你抛出一个异常,简单工厂模式是根据传入的参数来决定到底应该创建那个类的事例出来。下图是简单工厂模式的一般结构:
由上图可以看出,简单工厂模式由,工厂角色,抽象产品角色,产品角色,这三部分:
工厂角色:这是工厂方法模式的核心,但客户段调用他的工厂方法的时候,返回给客户端的是产品角色的一个类事例。
抽象产品角色:定义了产品角色所共有的共性,通常由一个java接口或者是一个java抽象类。如果具体产品之间没有共同的商业逻辑,就用java接口,如果有共同的商业逻辑,就用一个java抽象类。
产品角色:简单工厂方法所创建的任何一个对象都是这个角色的一个类事例。
角色之间是可以相互合并的,例如三个角色合并成一个,就好象单例模式,单例模式自身是自己的工厂角色,但并不完全等同于单例模式,单例模式中的构造方法是私有的。
简单工厂模式的缺点是当在产品角色中再增加一个类的时候,工厂方法必须有发生响应的改变,这就导致了扩展性,不符合开-闭原则。