(随记八)Android设计模式解析与实战自由扩展项目_Builder模式定义与简单实现 :
定义 : 将一个复杂对象的构建与它的 表示 分离 , 使得同样的构建过程可以创建出不同的 表示 .
使用场景 :
- 相同的方法 , 不同的执行顺序,产生不同的结果时 .
- 多个部件或零件 , 都可以装配到一个对象中 , 但是产生的运行结果又不同时 .
- 产品类非常复杂 , 或者产品类中的调用顺序不同产生了不同的作用 , 这个时候使用构建者模式时非常适合 .
UML类图 :
代码示例 :
- 计算机组装过程 : 构建主机 , 设置操作系统 , 设置显示器
通过 Director 和具体的 Builder 来构建计算机对象
package com.yt.Builder; /** * author : YiTao * Created by Taoy on 2016/12/21. * describe : 抽象Computer */ public abstract class Computer { protected String mBoard; protected String mDisplay; protected String mOS; //设置cpu核心数 public void setBoard(String board) { mBoard = board; } //设置内存 public void setDisplay(String display) { mDisplay = display; } //设置操作系统 public abstract void setOS(); @Override public String toString() { return "mBoard = " + mBoard + ",mDisplay=" + mDisplay + ",OS=" + mOS; } }
-
package com.yt.Builder; /** * author : YiTao * Created by Taoy on 2016/12/21. * describe : 具体Computer类 */ public class MacBook extends Computer { protected MacBook(){}; @Override public void setOS() { mOS = "MAC OS X 12.13"; } }
-
package com.yt.Builder; /** * author : YiTao * Created by Taoy on 2016/12/21. * describe : 抽象 Builder */ public abstract class Builder { //设置主机 public abstract void buildBoard(String board); //设置显示器 public abstract void buildDisplay(String display); //设置操作系统 public abstract void buildOS(); //创建 computer public abstract Computer create(); }
-
package com.yt.Builder; /** * author : YiTao * Created by Taoy on 2016/12/21. * describe : Bulider具体类 */ public class MacBookBulider extends Builder { private Computer mComputer = new MacBook(); @Override public void buildBoard(String board) { mComputer.setBoard(board); } @Override public void buildDisplay(String display) { mComputer.setDisplay(display); } @Override public void buildOS() { mComputer.setOS(); } @Override public Computer create() { return mComputer; } }
-
package com.yt.Builder; /** * author : YiTao * Created by Taoy on 2016/12/21. * describe : 负责构建 computer */ public class Director { Builder mBuilder = null; public Director(Builder builder) { mBuilder = builder; } public void construct(String board, String dispaly) { mBuilder.buildBoard(board); mBuilder.buildDisplay(dispaly); mBuilder.buildOS(); } }
测试代码 :
package com.yt.act; import android.app.Activity; import android.os.Bundle; import android.util.Log; import com.example.administrator.imageloader.R; import com.yt.Builder.Builder; import com.yt.Builder.Director; import com.yt.Builder.MacBookBulider; /** * Created by Administrator on 2016/12/16. */ public class MainAcativity extends Activity { String TAG = "MainAcativity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //构建 Builder builder = new MacBookBulider(); Director director = new Director(builder); director.construct("英特尔主板", "Retina 显示器"); Log.e(TAG, "onCreate: "+builder.create().toString() ); } }
上述示例中 , 通过具体的 MacbookBuilder 来构建 MacBook 对象 , 而Director封装了构建复杂产品对象的过程 , 对外隐藏构建细节 . Builder 与 Director 一起将一个复杂对象的构建与它的表示分离 , 是的同样的构建过程可以创建不同的对象 .
值得注意的是 , 在开发过程中 Director 会经常被忽略 , 而直接使用一个 Builder 来进行对象的组装 , 这个 Builder 通常为链式调用 , 它的关键点是每个 setter 方法都返回自身 , 也就是 return this ; 这样使得 setter方法可以链式调用 . 代码大致如下 :
new TestBuilder().setA("A").set("B").create();
通过这种形式不但去除了 Director 角色 , 整个结构也更加简单 , 也能对 Product 对象的组装过程有更精确的控制 .