工厂模式
在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。
除了解耦合,把对象的创建和使用的过程分开。工厂模式批量生产对象,还能有效降低代码重复,在业务逻辑发生变化时降低维护成本。 在开源框架中的使用很多,比如 Spring 框架中通过 getBean 方法获取 Bean 。
简单工厂
提供一个统一的工厂类,由用户调用其 static 方法来创建对象。可以根据用户输入参数来返回相应的对象。
public class ShapeFactory {
public static Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}
Shape circle = ShapeFactory.getShape("CIRCLE");
如果我们新增产品类的话,就需要修改工厂类中的 getShape 方法。这个弊端可以通过反射机制改善。
public class ShapeFactory {
public static Object getShape(Class<? extends Shape> c) {
Object obj = null;
try {
obj = Class.forName(c.getName()).newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
}
}
Circle circle = (Circle) ShapeFactory2.getClass(factory_pattern.Circle.class);
工厂方法
工厂方法模式是简单工厂的仅一步深化。在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说 每个对象都有一个与之对应的工厂 。
// 工厂接口
public interface Factory {
public Shape getShape();
}
// 专用工厂类,还可以有其他工厂类
public class CircleFactory implements Factory {
@Override
public Shape getShape() {
return new Circle();
}
}
抽象工厂
工厂方法模式中专用工厂类只生产单一产品。如果需要生产相互是有关系或有依赖的整套产品,就使用抽象工厂。
public interface Factory {
public Gun produceGun();
public Bullet produceBullet();
}
public class AKFactory implements Factory{
@Override
public Gun produceGun() {
return new AK();
}
@Override
public Bullet produceBullet() {
return new AK_Bullet();
}
}