FactoryMethod是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory Method 模式了.简单说来,Factory Method可以根据不同的条件产生不同的实例,当然这些不同的实例通常是属于相同的类型,具有共同的父类.Factory Method把创建这些实例的具体过程封装起来了,简化了客户端的应用,也改善了程序的扩展性,使得将来可以做最小的改动就可以加入新的待创建的类. 通常我们将Factory Method作为一种标准的创建对象的方法,当发现需要更多的灵活性的时候,就开始考虑向其它创建型模式转化.
这里举一个例子:
//这里也可以采用接口的形式来处理. 对于具体的应用,如Services和DAO层都是这 //样处理的 public abstract class Shape { // 勾画shape public abstract void draw(); // 擦去 shape public abstract void erase(); public String name; public Shape(String aName) { name = aName; } public Shape() { } }
package factory.method.abs;//圆形 public class Circle extends Shape { public Circle(String name) { super(name); } public Circle() { } @Override public void draw() { System.out.println(name + " Circle is draw ..... "); } @Override public void erase() { System.out.println(name + " Circle is erase ..... "); } }
package factory.method.abs;//方形 public class Square extends Shape { public Square(String name) { super(name); } public Square() { } @Override public void draw() { System.out.println(name + " Square is draw ..... "); } @Override public void erase() { System.out.println(name + " Square is erase ..... "); } }
package factory.method.abs; /** * 工厂 注工厂实例最是是设置成单例的(但这里没做处理) */ public class ShapeFactory { /** * 这是一种实现方式,直接通过传 入的类型来判断是创建哪一种类型的创建具体的实例对象 * @param aName * @param aType * @return * @throws NoThisShape */ public static Shape factoryMethod(String aName, String aType) throws NoThisShape{ if (aType.compareTo("square")==0) return new Square(aName); else if (aType.compareTo("circle")==0) return new Circle(aName); else throw new NoThisShape(aType); } private static Shape s; private ShapeFactory(){} // 在anOperation中定义Shape的一系列行为 public static void anOperation(String aName, String aType) throws NoThisShape{ s = factoryMethod(aName, aType); System.out.println("The current shape is: " + s.name); s.draw(); s.erase(); } }
package factory.method.abs; public class NoThisShape extends Exception { private static final long serialVersionUID = 743755614709478922L; public NoThisShape(String aName) { super(aName); } }
package factory.method.abs; public class MainApp { /** * @param args */ public static void main(String[] args) { try { ShapeFactory.anOperation("Shape one","circle"); ShapeFactory.anOperation("Shape two","square"); ShapeFactory.anOperation("Shape three", "delta");//没有这种类型的工厂类 } catch (NoThisShape e) { // TODO Auto-generated catch block e.printStackTrace(); } } }