什么是抽象工厂模式

所谓抽象工厂模式,就是为创建一组相关或者是互相依赖的对象提供一个接口,而不需要指定它们的具体类的设计模式。抽象工厂模式适用于一个对象族有相同的约束的情况,用不抽象的语言解释就是国内著名开发者服务商环信在Android和iOS平台都提供了IM SDK,尽管功能一样,但代码的实现逻辑是不同的,这就是抽象工厂模式。

抽象工厂模式的实现方式

尽管在讲工厂方法模式的时候我用化学知识举例,但那位技术编辑对我的理科生身份还是将信将疑,为了彻底消除他的疑惑,本文用生物知识“胚胎工程”举例,同时为了证明本文不是我的理科朋友捉刀代笔,本文中举例还要贴合他“海淀第一打野”的身份。

写代码之前我先带着大家复习一下“胚胎工程”和“嵌合体”:所谓胚胎工程,就是指对动物早期胚胎所进行的多种显微操作和处理技术;所谓嵌合体,就是利用胚胎工程将不同生物的胚胎进行胚胎分割移植制造出来的新生物。中华文化中的“龙”就可以视为给鳄鱼或蟒蛇加上马的头、鹿的角的嵌合体,然后“虎背熊腰”、“狼心狗肺”、“獐头鼠目”、“牛头马面”等都可以视为给人加上动物器官的嵌合体。

首先定义一个抽象的克隆人工厂类:

public abstract class CopyFactory {
public abstract IHead createHead();

public abstract IBody createBody();

}

抽象产品——克隆的头部胚胎:

public interface IHead {

void getHead();

}

抽象产品——克隆的身体胚胎:

public interface IBody {

void getBody();

}

具体产品——克隆的牛头胚胎:

public class CowHead implements IHead {
@Override
public void getHead() {
Log.e("CowHead","牛头~~");
}
}

具体产品——克隆的狗头胚胎:

public class DogHead implements IHead {
@Override
public void getHead() {
Log.e("DogHead","狗头~~");
}
}

具体产品——克隆的人头胚胎:

public class HumanHead implements IHead {
@Override
public void getHead() {
Log.e("HumanHead","人头~~");
}
}

具体产品——克隆的人身体胚胎:

public class HumanBody implements IBody {
@Override
public void getBody() {
Log.e("HumanBody","~~人");
}
}

具体产品——克隆的狗身体胚胎:

public class DogBody implements IBody {
@Override
public void getBody() {
Log.e("DogBody","~~狗");
}
}

具体工厂——克隆阿利斯塔的工厂:

public class AlistarFactory extends CopyFactory {
@Override
public IHead createHead() {
return new CowHead();
}

@Override
public IBody createBody() {
return new HumanBody();
}
}

具体工厂——克隆内瑟斯的工厂:

public class NasusFactory extends CopyFactory {
@Override
public IHead createHead() {
return new DogHead();
}

@Override
public IBody createBody() {
return new HumanBody();
}
}

具体工厂——克隆德莱厄斯的工厂:

public class DariusFactory extends CopyFactory {
@Override
public IHead createHead() {
return new HumanHead();
}

@Override
public IBody createBody() {
return new DogBody();
}
}

他和其他9个召唤师凑在一起,玩一局匹配模式:

Log.e("请问海淀第一打野 : ","阿利斯塔是什么生物?");
AlistarFactory alistarFactory= new AlistarFactory();
alistarFactory.createHead().getHead();
alistarFactory.createBody().getBody();

Log.e("请问海淀第一打野 : ","内瑟斯是什么生物?");
NasusFactory nasusFactory = new NasusFactory();
nasusFactory.createHead().getHead();
nasusFactory.createBody().getBody();

Log.e("请问海淀第一打野 : ","德莱厄斯是什么生物?");
DariusFactory dariusFactory = new DariusFactory();
dariusFactory.createHead().getHead();
dariusFactory.createBody().getBody();

海淀第一打野赢了游戏也相信了我的理工出身,读者也学会了抽象工厂模式,把以上代码认真实现一遍的人对着LogCat笑出了声。

Android源码中的抽象工厂模式

(1)Service的onBind

每个Service都是一个具体的工厂,每个Binder都是IBinder的具体产品。

(2)MediaPlayerFactory

MediaPlayerFactory是Android底层为创建不同的MediaPlayer所定义的一个类,每个MediaPlayer都实现了MediaPlayerFactory中的registerFactory_l方法。

Android开发中如何利用抽象工厂模式

(1)抽象工厂模式有一个显著的优点就是接口与实现的分离,切换产品类时非常灵活。在实现Android应用的换肤功能时,我们可以利用抽象工厂模式。

需要注意的几个问题

(1)抽象工厂模式的最大缺点就在于会产生比工厂方法模式更多的类文件。

(2)因为每增加一个新产品类都要修改抽象工厂,会造成每个具体工厂都要被修改,所以抽象工厂模式的产品类扩展麻烦。


本系列其他博客


【设计模式与Android】策略模式——锦囊里的上策中策下策


【设计模式与Android】状态模式——一个人的两幅面孔


【设计模式与Android】责任链模式——曹瞒兵败走华容


【设计模式与Android】命令模式——军令如山


【设计模式与Android】观察者模式——千里眼与顺风耳