Android设计模式与最佳实践
上QQ阅读APP看书,第一时间看更新

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应用程序,并学习如何监控性能,以及如何通过调试工具,实现不添加额外的屏幕组件即可测试输出。