模式定义
工厂方法模式(Factory Method Pattern):工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做得目的是将类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
模式结构
工厂方法模式结构图如图所示:
工厂方法模式包含如下角色:
1.Product(抽象产品)
抽象产品是定义产品的接口,是工厂方法模式所创建对象的超类型,也是产品对象的共同父类或接口。
2.ConcreteProduct(具体产品)
具体产品实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,它们之间一一对应。
3.Factory(抽象工厂)
在抽象工厂类中,声明了工厂方法,用于返回一个产品,抽象工厂是工厂方法模式的核心,它与应用程序无关。任何在模式中创建对象的工厂类都必须实现该接口。
4.ConcreteFactory(具体工厂)
具体工厂是抽象工厂的子类,实现了抽象工厂中定义的工厂方法,并可由客户调用,返回一个具体产品类的实例。在具体工厂类中包含与应用程序密切相关的逻辑,并且接受应用程序调用以创建产品对象。
模式分析
工厂方法模式与简单工厂模式在结构上的区别很明显,工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者共同的抽象父类。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开闭原则”。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性也不好。
实例
简单工厂模式中以电视剧代工厂类生产电视机,我们还是利用这个例子。该实例类图如图所示:
代码如下:
// 抽象产品类TV
public interface TV {
public void play();
}
// 具体产品类HaierTV
public class HaierTV implements TV {
public void play() {
System.out.println("海尔电视机播放中。");
}
}
// 具体产品类HisenseTV
public class HisenseTV implements TV {
public void play() {
System.out.println("海信电视机播放中。");
}
}
// 抽象工厂类 TVFactory
public interface TVFactory {
public TV produceTV();
}
// 具体工厂类HaierTVFactory
public class HaierTVFactory implements TVFactory {
public TV produce() {
System.out.println("海尔电视机工厂生产海尔电视机。");
return new HaierTV();
}
}
// 具体工厂类HaierTVFactory
public class HisenseTVFactory implements TVFactory {
public TV produce() {
System.out.println("海信电视机工厂生产海信电视机。");
return new HaierTV();
}
}
// 测试
public class Client {
public static void main(String[] args) {
TV tv;
TVFactory factory = new HaierTVFactory();
tv = factory.produceTV();
tv.play();
}
}