工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
下面通过简单举例来说明工厂方法模式的使用,逻辑关系如下图所示:
具体代码如下:
public interface Shape {
void draw();
}
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("画圆");
}
}
public class Square implements Shape{
@Override
public void draw() {
System.out.println("画正方形");
}
下面是工厂类,可以分三种方法实现,Android中更多的是以静态方法的形式生成实体类,其中个人认为通过反射的方法代码看起来比较简洁,可扩展性较好,但是缺点是性能较低
public class ShapeFactory {
public Shape getShape(String type){
if(type == null)
return null;
if("circle".equalsIgnoreCase(type)){
return new Circle();
}else if("square".equalsIgnoreCase(type)){
return new Square();
}
return null;
}
/**
* 通过静态方法生成相应实体类
*/
public static Circle getCircle(){
return new Circle();
}
public static Square getSquare(){
return new Square();
}
/**
* 通过反射得到具体实体类
*/
public static Object getType(Class<? extends Shape> cla){
Object object = null;
try {
object = Class.forName(cla.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
}
}
}
下面是测试类:
public class FactoryTest {
public static void main(String[] args){
//常规写法
System.out.println("-----------常规方法------------");
ShapeFactory shapeFactory = new ShapeFactory();
Circle circle = (Circle) shapeFactory.getShape("circle");
Square square = (Square) shapeFactory.getShape("square");
circle.draw();
square.draw();
//通过静态方法
System.out.println("-----------静态方法------------");
ShapeFactory.getCircle().draw();
ShapeFactory.getSquare().draw();
//通过反射
System.out.println("-----------反射方法------------");
((Circle)ShapeFactory.getType(Circle.class)).draw();
((Square)ShapeFactory.getType(Square.class)).draw();
//新增画长方形
((Rectangle)ShapeFactory.getType(Rectangle.class)).draw();
}
}
测试控制台输出结果如下:
-----------常规方法------------
画圆
画正方形
-----------静态方法------------
画圆
画正方形
-----------反射方法------------
画圆
画正方形
画长方形
最后谈谈Android中工厂方法模式的使用:
BitmapFactory中使用的是静态方法