1. 程式人生 > >【設計模式與Android】抽象工廠模式——嵌合體克隆工廠

【設計模式與Android】抽象工廠模式——嵌合體克隆工廠

設計模式 android

什麽是抽象工廠模式

所謂抽象工廠模式,就是為創建一組相關或者是互相依賴的對象提供一個接口,而不需要指定它們的具體類的設計模式。抽象工廠模式適用於一個對象族有相同的約束的情況,用不抽象的語言解釋就是國內著名開發者服務商環信在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)因為每增加一個新產品類都要修改抽象工廠,會造成每個具體工廠都要被修改,所以抽象工廠模式的產品類擴展麻煩。


本文出自 “玖哥的書房” 博客,請務必保留此出處http://dongfeng9ge.blog.51cto.com/9191243/1972484

【設計模式與Android】抽象工廠模式——嵌合體克隆工廠