设计模式---Builder模式

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

  使用场景:
  ①相同的方法,不同的执行顺序会导致不同的运行结果。
  ②初始化一个对象特别复杂(参数多、很多参数具有默认值)。
  ③多个“部件”或“零件”都可以装配到一个对象中,但是产生的运行结果却不同。

  经典的UML图:
  Builder模式UML图
  
  简单实现:

//产品类
public class Computer{
    //主板
    private String board;
    //显示屏
    private String display;

    public void setBoard(String board){
        this.board = board;
    }

    public void setDisplay(String display){
        this.display = display;
    }

    public String getBoard(){
        return this.board;
    }

    public String getDisplay(){
        return this.display;
    }
}

//抽象Builder类
public abstract class Builder{

    public abstract Builder setBoard(String board);

    public abstract Builder setDisplay(String display);

    public abstract Computer build();
}

//具体Builder类
public class ConcreteBuilder extends Builder{

    private Computer computer = new Computer();

    @Override
    public abstract Builder setBoard(String board){
        computer.setBoard(board);
        return this;
    }

    @Override
    public abstract Builder setDisplay(String display){
        computer.setDisplay(display);
        return this;
    }

    @Override
    public abstract Computer build(){
        return this.computer;
    }
}

//指挥者
public class Director{

    private Builder builder = null;

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

    public void construct(String board,String display){
        builder.setBoard(board)
               .setDisplay(display);
    }
}
public class Text{
    public static void main(String[] args){
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);

        director.construct("因特尔","Retina显示器");

        Computer computer = builder.build();

        System.out.println("主板:" + computer.getBoard() + "显示器:" + computer.getDisplay());
    }
}

  这里边可以发现Builder与Director将Computer的构建与表示分开了。只需要改变具体的Builder与Director我们就可以生产出不同的Computer。

  Builder模式特点:链式调用,即每个set方法都返回自身(return this)。

  安卓开发中常用的Builder模式:AlertDialog的使用。但并不是按照经典的模式实现的,常常我们在使用该模式时会采用内部类这种方式来实现:

//产品类
public class Computer{
    //主板
    private String board;
    //显示屏
    private String display;

    public String getBoard(){
        return this.board;
    }

    public String getDisplay(){
        return this.display;
    }

    //内部类
    public class Builder{
        //主板
        private String board = "Inter i5";
        //显示屏
        private String display = "Retina";

        private Computer computer = null;

        public Builder setBoard(String board){
            this.board = board;
            return this;
        }

        public Builder setDisplay(String display){
            this.display = display;
            return this;
        }

        public Computer build(){
            computer = new Computer();
            computer.board = this.board;
            computer.display = this.display;

            return computer;
        }
    }
}
public class Text{
    public static void main(String[] args){
        Computer.Builder builder = new Computer.ConcreteBuilder();
        builder.setBoard("Inter主板")
               .setDisplay("显示器");

        Computer computer = builder.build();

        System.out.println("主板:" + computer.getBoard() + "显示器:" + computer.getDisplay());
    }
}

  Builder模式最大的好处:对于复杂对象的构建,用户只需设置一些所关心的参数便可以构造出一个完整对象,构造简单。而不用担心因构造顺序、构造所需要的所有参数对最终结果的影响。内部的实现对用户完全透明。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值