FactoryMethod (工厂方法)模式
GOF : 定义一个用于创建对象接口,让子类决定实例化哪一个类。 FactoryMethod 使一个类的实例化延迟到其子类。
FactoryMethod 模式应该和 Abstract Factory 模式一起学习的,为了遵循《设计模式精解》一书的顺序放到了这里。同 Abstract Factory 模式一样 FactoryMethod 模式也是为了定义一系列相同的对象。在某些时候有必要创建于现存的某个类结构想对应得一个分层类结构,并让新的体系包含某些代理的责任。比如一个图形体系, Circle 、 Square 为一个层次的类结构。当我们用到这一层类的对象的时候,不必去定义并实例化每一个对象,我只需要一个代理体系为我们生成这些对象。那么我们可以用 FactoryMethod 模式来达到这个目的。
FactoryMethod 模式在定义框架的过程中很常用。这是因为框架存在一个抽象的层次上。通常,它们不知道,而且也不应该关心特定对象的实例化。它们需要将特定对象的决策推迟给框架的用户。
下面是标准简化 UML 图:
下面是一个实现实例 ,我们依然用 Shape 例子来解释说明。(我已经快把 Shape 用滥了,初学者看到这里可千万别以为 OO 只 能解决 Shape 这样的问题, OO 的强大不是我能随便评论的,呵呵!)
package FactoryMethod;
public abstract class ShapeFactory
{
public abstract void draw();
public static ShapeFactory shapeFactory(String shape)// 用来生产对象
{
if(shape.equals("Circle")){
return new Circle();
}
else if(shape.equals("Square")){
return new Square();
}
else
return null;
}//end shapeFactory(...)
}//end sbstract class ShapeFactory
package FactoryMethod;
public class Circle extends ShapeFactory
{
public void draw()
{
System.out.println("Draw a Circle!");
}//end draw()
}//end class Circle
package FactoryMethod;
public class Square extends ShapeFactory
{
public void draw()
{
System.out.println("Draw a Square!");
}//end draw()
}//end class Square
package FactoryMethod;
public class FactoryMethod
{
private ShapeFactory shape;
public void showFactoryMethod()
{
String[] str = {"Circle", "Square", "shape"};
for(int i = 0; i < str.length; ++i){
shape = ShapeFactory.shapeFactory(str[i]);
if(shape != null)
shape.draw();
}
}//end showFactoryMethod()
public static void main(String[] args)
{
System.out.println("The Factory Method Pattern!");
FactoryMethod fm = new FactoryMethod();
fm.showFactoryMethod();
}//end main(...)
}//end class FactoryMethod
FactoryMethod 模式是一个很直观的模式,在实际中将会不断地重复使用。它适用于你希望将对象实例化的规则推迟到某 个派生类的那些情况。在这样的情况下,最自然的做法就是将方法的实现放在对该行为负责的对象中。