一、工厂方法模式的定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
二、工厂方法模式的实现
首先,定义一个工厂接口(也可以是抽象类或者具体类)。
//抽象工厂类
public interface Factory{
public void method1();
}
在抽象工厂中声明了工厂方法但并未实现工厂方法,具体产品对象的创建由其子类负责。
//具体工厂类1
public class ConcreteFactory1 implements Factory{
@Override
public void method1(){
//具体逻辑处理
}
}
//具体工厂类2
public class ConcreteFactory2 implements Factory{
@Override
public void method1(){
//具体逻辑处理
}
}
具体工厂类实现了工厂方法,可以有多个,都继承于工厂类,不同的具体工厂可以创建不同的具体产品。
使用场景:
public static void main(String[] args) {
ConcreteFactory1 c1 = new ConcreteFactory1 ();
c1.method1();
ConcreteFactory2 c2 = new ConcreteFactory2 ();
c2.method1();
}
三、工厂方法模式的优缺点及应用场景
优点:首先,良好的封装性,代码结构清晰;如一个调用者需要一个具体的产品对象,只要知道这个产品的类名就可以了。其次,工厂方法模式的扩展性非常优秀,在系统中加入新产品时无须修改抽象工厂和抽象产品提供的接口,也无须修改其他的具体工厂和具体产品,只需要添加一个具体工厂和具体产品即可。
缺点:在添加新产品时需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
使用场景:工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,以免增加代码的复杂度。其次,需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。