Android源码中的设计模式之抽象工厂

       今天接着聊抽象工厂模式,我们之前有说过抽象工厂模式分为工厂方法和抽象工厂,工厂方法在前面Android源码中的设计模式之工厂方法这篇文章中有详细介绍。这一小节讲真正的抽象工厂,并结合Android源码中的例子,稍加分析,加深自己对抽象工厂的理解,也希望帮助到大家。

定义


       抽象工厂模式是一种软件开发模式。抽象工厂模式提供一种方式,可以将一组具有相同主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的抽象类型(既接口)。抽象工厂模式将一组对象的实现细节与他们的使用分离开来,换句话说就是解耦。

UML类图


完整版:地址

源码中的抽象工厂

WebViewFactoryProvider/WebViewChromiumFactoryProvider

我们先看看他们的代码:

WebViewFactoryProvider.java

1
2
3
4
5
6
7
8
9
10
11
12
13

public interface WebViewFactoryProvider {

...

WebViewProvider createWebView(WebView webView, WebView.PrivateAccess privateAccess);

...

CookieManager getCookieManager();

...
}

WebViewChromiumFactoryProvider.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {

@Override
public WebViewProvider createWebView(WebView webView,
WebView.PrivateAccess privateAccess)
{

WebViewChromium wvc = new WebViewChromium(this,
webView, privateAccess);

...

return wvc;
}

@Override
public CookieManager getCookieManager() {
synchronized (mLock) {
if (mCookieManager == null) {

...

mCookieManager = new CookieManagerAdapter(new AwCookieManager());
}
}
return mCookieManager;
}

...
}

       WebViewFactoryProvider是抽象工厂接口,定义了WebView及周边功能所需要对象的创建方法,这些方法大部分为工厂方法,它们返回的对象类型是抽象的,属于面向接口的编程风格。抽象工厂WebViewFactoryProvider创建的对象有:实现Webview核心功能的WebViewProvider,管理Cookie的CookieManager,地理位置相关的GeolocationPermissions和存储Web表单数据的WebviewDatabase等等。WebViewChromiumFactoryProvider是抽象工厂的具体实现者,它提供“Chromium”主题的产品族,也是目前最新版本Webview正在使用的产品族,在[这里][5]有说明。如果将来有新的浏览器引擎内核出现,那么只需按照WebViewFactoryProvider接口创建该主题下产品,然后替换现有的”Chromium”就可以完成换代,不用改动其他地方任何代码。

抽象工厂的优缺点

优点:

  • 抽象工厂将具体实现从用户代码中分离开来,降低系统耦合性。
  • 抽象工厂接口易于新产品族的添加,并且减低产品族替代的代价。

缺点:

  • 如果业务变化,父接口内部做出调整,那所有实现者都要做出调整。

参考资料