目录
工厂方法是由简单工厂模式改进来的。先说一下简单工厂模式。
一、 简单工厂模式
就是封装一个简单的工厂类,提供一个对外开放的获取实例的方法。为了获取不同类型的实例,我们可以通过传入一个参数来选择(或者写成不同的方法名getBenz、 getBMW)。
/**
*定义一个car接口
*/
interface Car{
public void run();
}
public class BenzCar implements Car {
@Override
public void run() {
System.out.println("Benz Car is running...");
}
}
public class BMWCar implements Car {
@Override
public void run() {
System.out.println("BMW Car is running...");
}
}
/**
*简单工厂类可以写为静态类或静态方法,方便调用
*/
public static class CarFactory {
public static Car createCar(String type){
Car car = null;
if("Benz".equals(type)){
car = new BenzCar();
}
else if("BMWCar".equals(type)){
car = new BMWCar();
}
return car;
}
}
简单工厂的缺点:
虽然简单工厂仅需要一个参数就可以用同一个工厂创建不同类型的车,但是当需要增加一种新的车型的时候,就需要修改CarFactory的代码,在其中添加创建新车型逻辑。而这违反了设计模式中的“开闭原则”——对扩展开放,对修改关闭。
二、 工厂方法模式
工厂方法模式提供了一组实现了相同接口的工厂类,每个工厂类可以生产一个类型。
/**
*定义车接口
*/
public interface Car {
public void run();
}
public class BMWCar implements Car {
@Override
public void run() {
System.out.println("BMW Car is running...");
}
}
public class BenzCar implements Car {
@Override
public void run() {
System.out.println("Benz Car is running...");
}
}
/**
*定义工厂接口
*/
public interface CarFactory {
public Car createCar();
}
public class BMWFactory implements CarFactory{
@Override
public Car createCar() {
return new BMWCar();
}
}
public class BenzFactory implements CarFactory {
@Override
public Car createCar() {
return new BenzCar();
}
}
我们定义了BMWFactory和BenzFactory来负责两个不同的车型创建。当有新的车型(如AudiCar)需要创建时,我们不需要修改BMWFactory和BenzFactory,而是另外新创建一个AudiFactory来负责这个工作。这样,就符合了“对扩展开放,对修改关闭”的原则。
三、简单工厂与工厂方法的比较
1. 结构复杂度
简单工厂占优。
简单工厂只需要一个工厂类,而工厂方法则需要随着子类型的增加而不断地扩充工厂类,使类的个数越来越多,增加结构复杂度。
2.代码复杂度
工厂方法占优。
代码复杂度和结构复杂度是一对矛盾。简单工厂方法在结构上面简单,其在代码复杂度上要高一些。简单工厂类随着产品的增加需要修改很多代码,而工厂方法模式只需要创建一个新的类完成单一职责。
3. 客户端编程难度
简单工厂占优。
工厂方法模式引入了较多的工厂实现类,每一种调用都要创建不同的工厂对象;而简单工厂类可以直接调用静态方法。
4.管理上的难度
简单工厂占优。
在扩展方面,工厂方法符合开闭原则具有良好的扩展性;但简单工厂只需要付出少量的代价(修改少量代码)也可以具有较好的扩展性。
在维护方面,如果某个类需要修改,工厂方法可能要修改多个实现类,而简单工厂只需要修改一个工厂类,工作量上减轻了不少。
总结: 综合来看,简单工厂模式易使用、易修改、易维护,因此通常更多地使用简单工厂模式。