二、Builder设计模式

1. Builder模式的介绍

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

2. Builder模式使用场景

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

3. Builder模式的UML类图

建造者模式

4. Builder模式Java代码

计算机的组装比较复杂,组装顺序是不固定的。将计算机的组装的过程简化为构建主机、设置操作系统、设置显示器3个部分,然后通过Director和具体的Builder来构建计算机对象。

  • 1.计算机抽象类:Product角色
public abstract class Computer {
            protected String mBorad;
            protected String mDisplay;
            protected String mOs;

            protected Computer() {
            }

            //设置主板
            public void setBorad(String borad) {
                this.mBorad = borad;
            }

            //设置内存
            public void setDisplay(String display) {
                this.mDisplay = display;
            }

            //设置操作系统
            public abstract void setOs();

            @Override
            public String toString() {
                return "Computer{" +
                        "mBorad='" + mBorad + '\'' +
                        ", mDisplay='" + mDisplay + '\'' +
                        ", mOs='" + mOs + '\'' +
                        '}';
            }
        }
  • 2.具体的Computer类,Macbook
public class MacBook extends Computer {
            protected MacBook() {

            }

            @Override
            public void setOs() {
                mOs = "Mac OSX X 10.0";
            }
        }
  • 3.抽象Builder类:
public abstract class Builder {

            //设置主机
            public abstract void buildBorad(String borad);

            //设置显示器
            public abstract void buildDisplay(String display);

            //设置操作系统
            public abstract void buildOs();

            public abstract Computer create();

        }
  • 4.具体的Builder类:
public class MacBookBuilder extends Builder {
            private Computer mComputer = new MacBook();

            @Override
            public void buildBorad(String borad) {
                mComputer.setBorad(borad);
            }

            @Override
            public void buildDisplay(String display) {
                mComputer.setDisplay(display);
            }

            @Override
            public void buildOs() {
                mComputer.setOs();
            }

            @Override
            public Computer create() {
                return mComputer;
            }
        }
  • 5.Director类,负责构造Computer
public class Director {
            Builder mBuilder = null;

            public Director(Builder builder) {
                this.mBuilder = builder;
            }

            public void construct(String board, String display) {
                mBuilder.buildBorad(board);
                mBuilder.buildDisplay(display);
                mBuilder.buildOs();
            }
        }
  • 6.测试代码:
public class Test {
            public static void main(String[] args) {
                Builder macBookBuilder = new MacBookBuilder();
                //Director
                Director director = new Director(macBookBuilder);

                director.construct("英特尔主板", "Retina显示器");

                System.out.println("Computer Info: " + macBookBuilder.create().toString());
            }
        }


  • 7.注意:
    以上代码中,通过具体的MacbookBuilder来构建MacBook对象,而Director封装了构建复杂产品产生的过程,对外隐藏了细节。
    在现实开发过程中,Director角色经常会被忽略。而直接使用一个Builder来进行对象的封装,这个Builder通常为链式调用,关键点是每个setter方法都返回自身。

new TestBuidler.setA(“A”).setB(“B”).create();

5. Builder模式在Android系统中

在Android源码中,最常用到的Builder模式就是AlertDialog.Builder,使用该Builder来够加你复杂的AlertDialog对象。

6. 总结

Builder 模式在Android开发中也较为常用,通常作为配置类的构建器将构建和表示分离开来,同时也是将配置从目标类中分离出来,避免过多的setter方法。Builder模式比较常见的实现方式是通过调用链实现,这样使得代码更简洁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值