之前我們對工廠方法模式已經有所了解了,那抽象工廠模式又是什么呢?
定義
為創建一組相關或者是相互依賴的對象提供一個接口,而不需要指定它們的具體類。
使用場景
如果一個或多個對象有相同的約束時,可以使用抽象工廠模式。那什么是有相同約束的對象呢?
舉個栗子,同樣是iPhone的處理器,但是可能是由三星或者臺積電分別代工生產的,如果用代碼模擬這個場景就可以考慮用抽象工廠模式。再比如不同型號的iPhone處理器有著不同的工藝制程,我們也可以用抽象工廠模式來模擬不同型號處理器的生產過程。
實現
抽象工廠模式一般由四大模塊組成:
- 抽象產品類:每種產品要實現的統一接口
- 具體的產品類:要創建的具體產品
- 抽象工廠類:聲明若干創建產品(對象)的方法
- 具體的工廠類:創建具體的產品
接下來我們用抽象工廠模式來模擬上述第一個例子。
首先創建一個抽象產品類:
public interface Processor {
void processor();
}
因為由三星和臺積電共同代工,則具體的產品類應該有兩個,代表是三星生產的還是臺積電生產的:
public class SamsungProcessor implements Processor{
@Override
public void processor() {
Log.e("SamsungProcessor", "三星代工的處理器");
}
}
public class TSMCProcessor implements Processor{
@Override
public void processor() {
Log.e("TSMCProcessor", "臺積電代工的處理器");
}
}
產品有了,就可以著手建廠了,創建一個抽象工廠類:
public abstract class ProcessorFactory {
public abstract Processor createProcessor();
}
接下來創建兩個具體的工廠類:三星和臺積電的工廠
public class SamsungProcessorFactory extends ProcessorFactory{
@Override
public Processor createProcessor() {
return new SamsungProcessor();
}
}
public class TSMCProcessorFactory extends ProcessorFactory {
@Override
public Processor createProcessor() {
return new TSMCProcessor();
}
}
到這里我們提到的四大模塊就都有了,做個測試吧:
public class Client {
public static void test() {
//生產三星代工的處理器
SamsungProcessorFactory samsungProcessorFactory = new SamsungProcessorFactory();
samsungProcessorFactory.createProcessor().processor();
//生產臺積電代工的處理器
TSMCProcessorFactory tsmcProcessorFactory = new TSMCProcessorFactory();
tsmcProcessorFactory.createProcessor().processor();
}
}
這是最終的log:
result
如果手機的屏幕、鏡頭模組、內存等部件也分別由不同的廠商供應,對應到代碼中就需要增加相應的工廠類和產品類,這樣就導致類文件數量激增,對項目而言并不是一件好事,所以在實際開發中還是要權衡利弊。
對比工廠方法模式,核心的四大模塊都是一樣的,但是構造的過程卻是不同的,在工廠方法模式中,只有一個具體的工廠,而在抽象工廠模式中可能會有多個具體的工廠,因為相同或類似的產品我們可以找多個工廠幫我們生產。