Android设计模式学习(包含Java设计模式)-Builder模式-AJDesignMode03

来源:互联网 发布:金英杰免费网络课2017 编辑:程序博客网 时间:2024/06/01 10:35

3.1 Builder模式介绍

  Builder模式是一步一步创建一个复杂对象的创建型模式。它允许用户在不知道内部细节的情况下,可以更精确地控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。
  因为一个复杂的对象有很多大量组成成分,如:汽车,有车轮,方向盘,发动机,还有各种小零件等,如何将这些部件装配成一辆汽车,这个装配过程很漫长,也很复杂,对于这种情况,为了在构建过程中对外部隐藏实现细节,就可以使用Builder模式将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。

3.2 Builder模式的定义

  将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。

3.3 Builder模式的使用场景

  (1)相同的方法,不同的执行顺序,产生不同的事件结果时。
  (2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
  (3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。
  (4)当初始化一个对象非常复杂,如参数多,且很多参数都具有默认值时。

3.4 Builder模式的UML类图

  UML类图如下图所示:

这里写图片描述

角色介绍:

  • Protect产品类———产品的抽象类;

  • Builder———抽象Builder类,规范产品的组建,一般是由子类实现具体的组建过程;

  • ConcreteBuilder———具体的Builder类;

  • Director———统一组装过程;

3.5 Builder模式的简单实现

  计算机的组装过程较为复杂,并且组装顺序是不固定的,为了易于理解,我们把计算机组装的过程简化成构建主机,设置操作系统,设置显示器3个部分,然后通过Director和具体的Builder来构建计算机对象。示例代码如下:

计算机抽象类,即Product角色

public abstract class Computer {    protected String mBoard;    protected String mDisPlay;    protected String mOS;    protected Computer(){    }    public void setmBoard(String mBoard) {        this.mBoard = mBoard;    }    public void setmDisPlay(String mDisPlay) {        this.mDisPlay = mDisPlay;    }    public abstract void setOS(String OS);    @Override    public String toString() {        return "Computer[mBoard="+mBoard+",mDisPlay="+mDisPlay+",mOS="+mOS+"]";    }}

具体的Computer类,MacBook

public class MacBook extends Computer {    protected MacBook(){    }    @Override    public void setOS() {        mOS = "Mac OS X 10.10";    }}

抽象Builder类

public abstract class Builder {    //设置主机    public abstract void builderBoard(String board);    //设置显示器    public abstract void builderDisplay(String display);    //设置操作系统    public abstract void builderOS();    //创建Computer    public abstract Computer create();}

具体的Builder类,MacbookBuilder

public class MacBookBuilder extends Builder {    private Computer mComputer = new MacBook();    @Override    public void builderBoard(String board) {        mComputer.setmBoard(board);    }    @Override    public void builderDisplay(String display) {        mComputer.setmDisPlay(display);    }    @Override    public void builderOS() {        mComputer.setOS();    }    @Override    public Computer create() {        return mComputer;    }}

Director类,负责构造Computer

public class Director {    Builder mBuilder = null;    public Director(Builder builder){        mBuilder = builder;    }    //构建对象    public void construct(String board,String display){        mBuilder.builderBoard(board);        mBuilder.builderDisplay(display);        mBuilder.builderOS();    }}

测试类:

public class Test {    public static void main(String[] args){        //构造器        Builder builder = new MacBookBuilder();        //Director        Director pcDirector = new Director(builder);        //封装构建过程,4核,内存2GB,Mac系统        pcDirector.construct("英特尔主板","Retina显示器");        //构建计算机,输出相关信息        System.out.println("Computer Info : "+builder.create().toString());    }}

输出结果:

Computer Info : Computer[mBoard=英特尔主板,mDisPlay=Retina显示器,mOS=Mac OS X 10.10]  

  上述示例中,通过具体的MacbookBuilder来构建Macbook对象,而Director封装了构建复杂产品对象的过程,对外隐藏构建细节。Builder与Director一起将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的对象。
  值得注意的是,在现实开发过程中,Director角色经常会被忽略掉。而直接使用一个Builder来进行对象的组装,这个Builder通常为链式调用,它的关键点是每个setter方法都返回自身,也就是return this,这样就使得setter方法可以链式调用,代码大致如下:

new TestBuilder().setA("A").setB("B").create();

  通过这种形式不仅去除了Director角色,整个结构也更加简单,也能对Product对象的组装过程有更精细的控制。比如,我们把上面的Builder类进行修改,代码如下:

修改Builder:

public abstract class Builder {    //设置主机    public abstract Builder builderBoard(String board);    //设置显示器    public abstract Builder builderDisplay(String display);    //设置操作系统    public abstract Builder builderOS();    //创建Computer    public abstract Computer create();}

修改MacbookBuilder:

public class MacBookBuilder extends Builder {    private Computer mComputer = new MacBook();    @Override    public Builder builderBoard(String board) {        mComputer.setmBoard(board);        return  this;    }    @Override    public Builder builderDisplay(String display) {        mComputer.setmDisPlay(display);        return  this;    }    @Override    public Builder builderOS() {        mComputer.setOS();        return  this;    }    @Override    public Computer create() {        return mComputer;    }}

再次进行测试:

public class Test {    public static void main(String[] args){        //构造器        Builder builder = new MacBookBuilder();        //直接通过builder构建计算机,然后输出相关信息        System.out.println("Computer Info : "+builder.builderBoard("因特尔主板").builderDisplay("Retina显示器").builderOS().create().toString());    }}

输出结果:

Computer Info : Computer[mBoard=因特尔主板,mDisPlay=Retina显示器,mOS=Mac OS X 10.10]

本篇文章大部分引用《Android设计模式解析与实战》,特此注明一下。

下篇文章:
使程序运行更高效————原型模式
传送门:待更新..

原创粉丝点击