介绍
关于设计模式,大家可能已经有很多了解了。因此这里直接开始吧。首先来介绍一下工厂方法模式,它是一种创建型模式。在设计模式:可复用面向对象软件的基础中对工厂方法由如下的解释。
工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”
当然在实际情况中并不一定非要死板的定义一个工厂接口和多个工厂具体类。如果某个类对象创建复杂,我们也可以直接创建相应的工厂类,这时候这种方式叫做简单工厂。
工厂方法模式在很多地方都有应用,例如Hibernate的SessionFactory、JPA的EntityManagerFactory等等。
适用性
如果对象创建需要大量重复代码,那么我们就可以考虑使用工厂方法重构代码。当然,如果一组对象需要统一创建和管理,我们也可以使用工厂方法模式。总之,只要确实有必要你就可以使用该模式。在使用该模式的时候相关类最好使用Factory来命名,这样其他人也能比较轻松的识别出这是工厂模式。
代码例子
下面用Java代码实现了一个简单工厂的例子。首先我们来编写一组相关类。
代码语言:javascript复制public interface Shape {
int Square = 1;
int Circle = 2;
int Rectangle = 3;
void print();
}
public class Circle implements Shape {
@Override
public void print() {
System.out.println("圆");
}
}
public class Rectangle implements Shape {
@Override
public void print() {
System.out.println("长方形");
}
}
public class Square implements Shape {
@Override
public void print() {
System.out.println("正方形");
}
}
然后来编写工厂方法。在工厂方法模式中,具体的创建类的代码就在工厂类中。我们这里只是一个简单的例子。实际的代码要比这复杂的多。
代码语言:javascript复制public class ShapeFactory {
public Shape getShape(int shapeType) {
Shape shape = null;
switch (shapeType) {
case Shape.Square:
shape = new Square();
break;
case Shape.Circle:
shape = new Circle();
break;
case Shape.Rectangle:
shape = new Rectangle();
break;
}
return shape;
}
}
之后我们就可以通过工厂来创建对象了。
代码语言:javascript复制 public void run() {
ShapeFactory factory = new ShapeFactory();
Shape square = factory.getShape(Shape.Square);
square.print();
Shape rectangle = factory.getShape(Shape.Rectangle);
rectangle.print();
Shape circle = factory.getShape(Shape.Circle);
circle.print();
}