【設計模式與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】觀察者模式——千里眼與順風耳

相關文章
相關標籤/搜索