工厂方法模式属于创建型模式。它是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时还弥补了简单工厂模式的缺陷,更好的符合“开闭原则”的要求。当我们添加一个新的产品对象的时候,不需要对已有系统做任何修改,只需要添加一个新的产品类和新的工厂。
将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。
定义:在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
在工厂方法模式中,具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。
举例
我们都知道电视机有很多品牌,如果我们按照原先的简单工厂模式,那么每一次我们添加新的电视机品牌时,我们都需要修改工厂类中的代码。如果我们采用工厂方法模式,只需添加一个新的电视机品牌工厂,实现工厂父类TVFactory
中的方法即可,无需改动原来的代码。类与类之间的关系图如下:
代码如下:
TV.java
public abstract class TV {
abstract void play();
}
HaierTV.java
public class HaierTV extends TV {
@Override
void play() {
System.out.println("海尔电视");
}
}
MediaTV.java
public class MediaTV extends TV {
@Override
void play() {
System.out.println("美的电视");
}
}
TVFactory.java
public abstract class TVFactory {
abstract TV produce();
}
HaierTVFactory.java
public class HaierTVFactory extends TVFactory {
@Override
TV produce() {
return new HaierTV();
}
}
MediaTVFactory.java
public class MediaTVFactory extends TVFactory {
@Override
TV produce() {
return new MediaTV();
}
}
测试:
public class Main {
public static void main(String[] args) {
TVFactory tvFactory=new HaierTVFactory();
TV Haier = tvFactory.produce();
Haier.play(); //海尔电视
tvFactory=new MediaTVFactory();
TV Media = tvFactory.produce();
Media.play(); //美的电视
}
}
如果我们需要添加新的电视机品牌,只需添加如下如下代码,不需要修改源代码:
NewTV.java
public class NewTV extends TV {
@Override
void play() {
System.out.println("新的电视");
}
}
NewTVFactory.java
public class NewTVFactory extends TVFactory {
@Override
TV produce() {
return new NewTV();
}
}
结论
使用工厂方法模式遵循了开闭原则。但在增加新产品的时候需要增加一个新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。