【设计模式与Android】抽象工厂模式——嵌合体克隆工厂-创新互联

什么是抽象工厂模式

创新互联服务项目包括东港网站建设、东港网站制作、东港网页制作以及东港网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,东港网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到东港省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

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

抽象工厂模式的实现方式

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

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

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

public abstract classCopyFactory {
    public abstractIHead createHead();

    public abstractIBody createBody();

}

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

public interfaceIHead {

    voidgetHead();

}

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

public interfaceIBody {

    voidgetBody();

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public classDariusFactory extendsCopyFactory {
    @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】观察者模式——千里眼与顺风耳

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:【设计模式与Android】抽象工厂模式——嵌合体克隆工厂-创新互联
链接URL:http://pwwzsj.com/article/ceicio.html