builder模式

builder模式通过设置一些属性来创建对象,根据设置属性的顺序分为两种:
1. 无顺序要求
2. 有顺序要求
常见是无顺序要求的,比如dialog的创建。

1,无顺序要求

需求:

  • 创建一个Macbook,电脑有三个属性 操作系统、键盘、鼠标。

思路:

  • 使用Macbook 内部类Builder来为Macbook设置属性,并创建最终的Macbook
  • 因为Macbook属于电脑,可以再建一个computer的接口
    这里写图片描述

代码:

通过builder的的static内部类实现

package com.example.builder;

/**
 * 创建者模式
 * @author car
 *
 */
public class BuilderPattern {

    public static void main(String[] args) {
        BuilderPattern pattern=new BuilderPattern();
        pattern.build();
    }
    public void build() {
        Macbook.MacbookBuilder builder=new Macbook.MacbookBuilder();
        Computer macbook=builder.setBoard("英特尔 I7").setDisplay("Retina 显示器").setOS("MacOS").build();
        System.out.println(macbook.toString());
    }
}

Computer.java:

package com.example.builder;
/**
 * 被创建者 的抽象
 * @author car
 *
 */
public abstract class Computer {
    protected String mBoard;
    protected String mDisplay;
    protected String mOS;

    @Override
    public String toString() {
        return mBoard+" "+mDisplay+" "+mOS;
    }
}

Macbook.java

package com.example.builder;

public class Macbook extends Computer{

    MacbookBuilder builder;
    public Macbook(MacbookBuilder builder) {
        this.mDisplay=builder.mDisplay;
        this.mBoard=builder.mBoard;
        this.mOS=builder.mOS;
    }

    public static class MacbookBuilder extends Builder{

        protected String mBoard;
        protected String mDisplay;
        protected String mOS;

        //设置主板
        public MacbookBuilder setBoard(String mBoard) {
            this.mBoard=mBoard;
            return this;
        }
        //设置显示器
        public MacbookBuilder setDisplay(String mDisplay) {
            this.mDisplay=mDisplay;
            return this;
        }

        @Override
        public MacbookBuilder setOS(String mOS) {
            this.mOS=mOS;
            return this;
        }

        @Override
        public Computer build(){
            return new Macbook(this);
        }

    }

}

Builder.java

package com.example.builder;

/**
 * 抽象的 创建者
 * @author car
 *
 */
public abstract class Builder {
    protected String mBoard;
    protected String mDisplay;
    protected String mOS;

    //设置主板
    public abstract Builder setBoard(String mBoard);
    //设置显示器
    public abstract Builder setDisplay(String mDisplay);
    //设置操作系统
    public abstract Builder setOS(String mOS);
    //生成一个电脑
    public abstract Computer build();
}

2,有顺序要求

上面无顺序的只要把需要的属性设置成功就ok。
有顺序要求的举个例子。安装电脑我们不仅需要键盘、显示器等原材料,我们还要知道安装的顺序,即需要一个工程师在一边指导工人干活。
需求:安装电脑,先安装系统、再安装显示器、最后键盘
思路:builder负责安装、director负责设计指挥、产品Macbook
这里写图片描述

代码:
director控制builder的执行顺序,赋值过程在macbook里面实现:

package com.example.builder.store;

public class BuilderPattern {
    public static void main(String[] args) {
        BuilderPattern pattern=new BuilderPattern();
        pattern.build();
    }
    public void build() {
        ComputerBuilder builder = new ComputerBuilder();
        Director director = new Director();
        director.command(builder);
        System.out.println(builder.getComputer().toString());
    }
}

Builder.java

package com.example.builder.store;

import com.example.builder.Computer;

interface Builder {
    //设置主板
    public abstract void createBoard();
    //设置显示器
    public abstract void createDisplay();
    //设置操作系统
    public abstract void createOS();

}

ComputerBuilder.java

package com.example.builder.store;

public class ComputerBuilder implements Builder{

    Macbook macbook = new Macbook();
    @Override
    public void createBoard() {
        // TODO Auto-generated method stub
        macbook.mBoard="board";
    }

    @Override
    public void createDisplay() {
        // TODO Auto-generated method stub
        macbook.mDisplay="diaplsy";
    }

    @Override
    public void createOS() {
        // TODO Auto-generated method stub
        macbook.mOS="os";
    }

    public Macbook getComputer(){
        return macbook;
    }

}

Director.java

package com.example.builder.store;

public class Director {

    public void command(Builder builder){
        builder.createOS();
        builder.createDisplay();
        builder.createBoard();
    }
}

Macbook.java

package com.example.builder.store;

public class Macbook {

    protected String mBoard;
    protected String mDisplay;
    protected String mOS;

    @Override
    public String toString(){
        return mBoard+mDisplay+mOS;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值