工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式。
在工厂方法模式中,与简单工厂的区别在于,不是由一个统一的工厂来创建所有的对象,而是一个子对象产品对应一个具体的工厂。
-
Product(抽象产品)
它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。和简单工厂模式中的写法一样。
-
ConcreteProduct(具体产品)
它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。和简单工厂模式中的写法一样。
-
Factory(抽象工厂)
在抽象工厂类中,声明了工厂方法(Factory Method),用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
public interface MapFactory {
// GWIMapBaseLayout createMapView();
GWIMapBaseLayout createMapView(Context context);
}
-
ConcreteFactory(具体工厂)
它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
public class BaiduOutdoorMapFactory implements MapFactory {
@Override
public GWIMapBaseLayout createMapView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
return (GWIMapBaseLayout) inflater.inflate(R.layout.baidu_map_layout, null);
}
}
-
调用方式
调用方只需要关注工厂类即可,需要什么对象产品就拿到对应的工厂类来创建对应的产品。
MapFactory mapFactory = new BaiduOutdoorMapFactory();
GWIMapBaseLayout gwiMapBaseLayout = mapFactory.createMapView(this);
- 工厂方法模式基本包含了简单工厂模式的所有优点,并且解决了简单工厂模式的一个缺点,不再是一个工厂创建所有的子对象,而是由一个抽象工厂,然后很多的子工厂类来创建对应的子对象,这样避免了一个静态工厂方法过于复杂,容错率低,以后新增子对象只需要增加一个子对象类和一个具体工厂类即可,不需要修改原有的代码,完全符合了开闭原则。
- 但是由于每个工厂只生产一个类,如果子对象具体产品过多的话,项目中的类是成对增加的,一个子对象类一个具体工厂类,这样的话项目中会有很多的类。