成都网站建设设计

将想法与焦点和您一起共享

【设计模式与Android】抽象工厂模式——嵌合体克隆工厂

什么是抽象工厂模式

创新互联致力于成都网站设计、网站建设,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联,就选择了安全、稳定、美观的网站建设服务!

 

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

 

抽象工厂模式的实现方式

 

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

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

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

public abstract classCopyFactory {
    public abstractIHead createHead();

    public abstractIBody createBody();

}

 

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

public interfaceIHead {

    voidgetHead();

}

 

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

public interfaceIBody {

    voidgetBody();

}

 

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

public classCowHeadimplementsIHead {
    @Override
    public voidgetHead() {
        Log.e("CowHead","牛头~~");
    }
}

 

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

public classDogHeadimplementsIHead {
    @Override
    public voidgetHead() {
        Log.e("DogHead","狗头~~");
    }
}

 

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

public classHumanHeadimplementsIHead {
    @Override
    public voidgetHead() {
        Log.e("HumanHead","人头~~");
    }
}

 

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

public classHumanBodyimplementsIBody {
    @Override
    public voidgetBody() {
        Log.e("HumanBody","~~人");
    }
}

 

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

public classDogBodyimplementsIBody {
    @Override
    public voidgetBody() {
        Log.e("DogBody","~~狗");
    }
}

 

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

public classAlistarFactoryextendsCopyFactory {
    @Override
    publicIHead createHead() {
        return newCowHead();
    }

    @Override
    publicIBody createBody() {
        return newHumanBody();
    }
}

 

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

public classNasusFactoryextendsCopyFactory {
    @Override
    publicIHead createHead() {
        return newDogHead();
    }

    @Override
    publicIBody createBody() {
        return newHumanBody();
    }
}

 

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

public classDariusFactoryextendsCopyFactory {
    @Override
    publicIHead createHead() {
        return newHumanHead();
    }

    @Override
    publicIBody createBody() {
        return newDogBody();
    }
}

 

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

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

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

Log.e("请问海淀第一打野 : ","德莱厄斯是什么生物?");
DariusFactory dariusFactory =newDariusFactory();
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】观察者模式——千里眼与顺风耳


名称栏目:【设计模式与Android】抽象工厂模式——嵌合体克隆工厂
分享地址:http://chengdu.cdxwcx.cn/article/ghpehc.html