工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。通俗的来说就是把简单工厂模式里面的分支语句给去掉,将每个具体产品的实例化过程放到不同的工厂子类中去。相应的角色如下:
(1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
(2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
(3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类 或者接口来实现。
(4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类 来实现。
工厂方法模式使用继承自抽象工厂的多个子类来代替简单工厂模式中的“工厂类角色”。当有新的产品产生时,只要按照抽象产品角色 、抽象工厂角色提供的合同来生成 ,那么就可以被客户使用,而不必去修改已有的代码。
//抽象产品角色
public interface Car {
public void drive();
}
//具体产品角色
public class Benz implements Car
{
public void drive() {
System.out.println("Driving Benz!");
}
}
//具体产品角色
public class Audi implements Car
{
public void drive() {
System.out.println("Driving Audi!");
}
}
......
//抽象工厂角色
public interface Driver {
public Car driveCar();
}
//具体工厂角色
public class BenzDriver implements Driver {
@Override
public Car driveCar() {
return new Benz();
}
}
//具体工厂角色
public class AudiDriver implements Driver {
@Override
public Car driveCar() {
return new Audi();
}
}
......
//客户使用
public class Magnate
{
public static void main (String [] args)
{
Driver driver = new BenzDriver();
Car car = driver.driveCar();
car.drive();
}
}
输出结果:Driving Benz!
可以看出工厂方法的加入,使得对象的数量成倍增加。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情况,可以使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类。
下面情况可以考虑使用工厂方法模式:
(1)当客户程序不需要知道要使用对象的创建过程。
(2)客户程序使用的对象存在变动的可能, 者根本就不知道使用 哪一个具体的对象。
简单工厂模式与简单工厂方法模式真正的避免了代码的改动了?没有。在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体 工厂写死(就象上面的例子一样)。而且产品对象创建条件的改变必然会引起 工厂角色的修改。这种情况在java中利用反射机制与配置文件的巧妙结合突破了限制。