抽象工厂模式的定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
抽象工厂的使用场景
一个对象族有相同的约束时可以使用抽象工厂模式。举个例子:
Android、ios、window phone下都有短信软件和拨号软件,两者都属于软件的范畴,但是它们所在的操作系统平台不一样,即便是同一家公司出品的软件,其代码的实现逻辑也是不同的,这时候就考虑使用抽象工厂方法模式来生产Android、ios、Window phone下的短信软件和拨号软件。
抽象工厂模式的类比较多,但是,主要分为四类:
1.AbstractFactory:抽象工厂角色, 它声明了一组用于创建一种产品的方法,每一种方法对应一种产品,如上述类图的AbsttractFactory中就定义了两个方法,分别创建产品A和产品B。
2.ConcreteFactory:具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品种类,每一个产品都位于某一个产品等级结构中,如上述类图的ConcreteFactory1和Concretefactory2。
3.AbstractProduct:抽象产品角色,他为每种产品声明接口,比如上述类图中的AbstratctProductA、AbstractProductB。
4.ConcreteProduct:具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法,如上述类图中的ConcreteProductA1、ConcreteProductA2、ConcreteProductB1、ConcreteProductB2。
抽象工厂方法模式的UML类图:
抽象工厂模式的优点:
一个显著的优点是分离接口 与 实现,客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口与实现的分离,使抽象工厂方法模式在切换产品种类时更加灵活、容易。
抽象工厂模式的缺点:
上面我们也有所提及,一是类文件的爆炸性增加,二是不太容易扩展新的产品类,因为每当我们增加一个产品类就需要修改其抽象工厂,那么所有的具体工厂类均会被修改。
抽象工厂方法模式在Android源码中实现相对来说比较少,我们说过Activity的onCreate方法其实就相当于一个工厂方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new LinearLayout(this));
}
同样,对于另外一个组件Service来说,其onBind方法也可以看做是一个工厂方法。
public class BaseService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
}
如果从framework的角度来看Activity和Service,都可以看做是一个具体的工厂。这样来看相对于一个抽象工厂方法模式的雏形也没有错。
参考《Android源码设计模式》