工厂模式分为三种:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
这里简单表示下三种工厂模式的UML图,不再详细说明三种工厂模式的具体细节。
1.1 普通模式(没有使用工厂模式):

客户端对接口以及对应的实现类都具有依赖。如果扩展要修改客户端代码。违反开闭原则。
1.2 简单工厂模式(静态工厂模式):
工厂代码:
public class CarFactory
{
public static Car creatCar(String name)
{
Car car = null;
if("奥迪".equals(name))
{
car = new Audi();
}else if ("比亚迪".equals(name))
{
car = new Byd();
}
return car;
}
}
或者
public class CarFactory
{
public static Car creatAudi()
{
return new Audi();
}
public static Car creatByd()
{
return new Byd();
}
}
客户端对接口以及工厂方法有依赖
很明显无论是上述的哪种工厂,当新增一种车型时,都必须对工厂类进行修改,不符合开闭原则。
1.3 工厂方法模式:
工厂方法模式的特点:
- 为了符合开闭原则。
- 简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
当新增一种车型时,需要增加这种车型的实体类以及这种车型的Factory,符合了开闭原则。由于要符合开闭原则,实体类和工厂类的数量大幅度提高。客户端的依赖也变多。下面对工厂方法模式与简单工厂模式进行对比:
- 结构复杂度:
从这个角度比较,显然简单工厂模式要占优,简单工厂模式只有一个工厂类,而工厂方法模式的工厂类随着产品的增加而增加,这使类越来越多,从而增加了结构复杂度。
- 代码复杂度:
简单工厂模式的工厂类随着产品的增加需要增加,而工厂方法模式每个具体工厂类只负责单一的任务,工厂方法模式代码更简洁。
- 客户端编程复杂度
工厂方法模式虽然符合开闭原则,但是在客户端编码中需要对各种工厂类进行实例化,而简单工厂模式只有一个静态的工厂类,在客户端无需实例化,简单工厂模式客户端编程复杂度更低。
- 管理上的难度
工厂方法模式完全符合开闭原则,有很好的扩展性,但是需要增加许多类。虽然简单工厂模式没有符合开闭原则,但是也只是需要增加一个实体类,然后在工厂类中修改少量代码即可。在这点上看来,其实简单工厂模式更加容易管理。
根据设计理论来选择:工厂方法模式,但是我们平时简单工厂模式用得更多。
1.4 抽象工厂模式:
特点:
用来生产不同产品族的全部产品(对于增加新的产品无能为力,支持增加产品族)。
三种工厂模式要点:
- 简单工厂模式(静态工厂模式):虽然不符合开闭原则,但是最常用。
- 工厂方法模式:不修改已有类的情况下,通过增加新的工厂类来实现扩展,符合开闭原则。
- 抽象工厂模式:不可以增加新的产品,可以增加产品族。
参考资料:
- http://blog.youkuaiyun.com/zhengzhb/article/details/7359385