
1.5 工厂模式
工厂模式是使用最广的创建型模式之一。顾名思义,它会创建一些东西。确切地说,它会创建对象。工厂模式的用途是借助通用接口将逻辑与使用分开。要了解工厂模式的工作原理,最好的方式就是实践。打开我们之前创建的项目,或者新建一个项目。最低SDK版本和目标SDK版本对本练习来说并不重要。
当选择API 21及以上版本时,Android Studio可以采用热部署技术。热部署避免了每次运行项目时都要重新构建项目,这大大加快了应用程序的测试速度。因为热部署能节约时间,所以若计划将目标平台设置成较低的版本,可以在开发完成之后再降低版本。
我们将构建一个非常简单的示例应用程序,用于生成“三明治制作应用程序”所需的对象,这些对象代表不同种类的面包。为了强调模式,我们将保持示例的简单,对象的返回值不会比字符串复杂。
(1)在项目视图中找到MainActivity.java文件。
(2)右键单击,新建一个Java类,种类选择接口(Interface),类名叫Bread,如图1-3所示。

图1-3
(3)完成接口:
public interface Bread { String name(); String calories();}
(4)创建Bread的具体类:
public class Baguette implements Bread { @Override public String name() { return "Baguette"; } @Override public String calories() { return " : 65 kcal"; } } public class Roll implements Bread { @Override public String name() { return "Roll"; } @Override public String calories() { return " : 75 kcal"; } } public class Brioche implements Bread { @Override public String name() { return "Brioche"; } @Override public String calories() { return " : 85 kcal"; } }
(5)创建一个新类,取名BreadFactory:
public class BreadFactory { public Bread getBread(String breadType) { if (breadType == "BRI") { return new Brioche(); } else if (breadType == "BAG") { return new Baguette(); } else if (breadType == "ROL") { return new Roll(); } return null; } }
UML图
理解设计模式的关键在于理解它们的结构以及组件之间的关联。图形化是查看设计模式的最佳方式之一,统一建模语言(unified modeling language, UML)类图则是实现图形化的好方法。
思考一下,我们刚刚创建的设计模式该如何用图形化的方式表达。图1-4给出了示例。

图1-4
设计模式已经准备就绪,接下来要做的就是查看它的实际效果。对于这个示例,我们将在布局中使用模板生成的TextView。每次主活动(MainActivity)启动时,onCreate()方法都会被调用。
(1)在文本模式下打开activity_main.xml文件。
(2)为文本视图添加id:
<TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" />
(3)打开MainActivity.java文件,依照以下代码编辑onCreate()方法。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.text_view); BreadFactory breadFactory = new BreadFactory(); Bread bread = breadFactory.getBread("BAG"); textView.setText(new StringBuilder() .append(bread.name()) .toString()); }
根据Android Studio的设置,可能需要导入TextView小部件:import android. widget.TextView;。通常,编辑器会提示你,按下Alt+Enter快捷键即可导入。
现在,可以在模拟器或真机上测试设计模式了,如图1-5所示。

图1-5
乍看之下,这可真是小题大做,但也是设计模式的魅力所在。新增的抽象层让我们无须编辑活动(activity)就能修改类,反之亦然。当需要开发更复杂的对象以及使用多个工厂时,该特性的实用性将变得更加明显。
本节的示例太简单了,以至于不需要做任何测试。不过,我们不妨来探索如何在真机和模拟器上测试Android应用程序,并学习如何监控性能,以及如何通过调试工具,实现不添加额外的屏幕组件即可测试输出。