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

什么是抽象工厂模式设计模式

 

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

 

抽象工厂模式的实现方式spa

 

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

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

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

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

    
public abstract IBody createBody();

}
blog

 

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

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

相关文章
相关标签/搜索