设计模式之Builder构建者模式

1.定义
使复杂对象的构建与表示分离,使同样的构建过程有不同的表示。
2.使用场景
(1)相同的方法,不同的执行顺序,产生不同的事件结果时。
(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个使用建造者模式非常适合。
(4)当初始化一个对象特别复杂时,如参数多,且很多参数有默认值。
3.第一种经典的实现方式
Client Director Builder Product模式

(转)
简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!

最终的产品:Product (Room)

public class Room {

    private String window;
    private String floor;

    public void setWindow(String window){
        this.window = window;
    }
    public void setFloor(String floor){
        this.floor = floor;
    }

    public String getWindow(){
        return window;
    }

    public String getFloor(){
        return floor;
    }
    @Override
    public String toString() {
        return "{\"window\":\"" + window + "\",\"floor\":\"" + floor + "\"}";
    }

}

Buidler构建者接口,功能就是建窗户,建地板,最终将Product交付给Client

public interface Builder {

    public void makeWindow();

    public void makeFloor();

    public Room returnRoom();
}

Buidler的实现

public class RoomBuilder implements Builder{

    private Room room = new Room();

    @Override
    public void makeWindow() {
        room.setWindow("Window");
    }

    @Override
    public void makeFloor() {
        room.setFloor("Floor");
    }

    @Override
    public Room returnRoom() {
        return room;
    }

}

Director 指挥Builder如何工作(构建顺序)

public class Director {

    public void command(Builder builder){
        //先建造窗户
        builder.makeWindow();
        //然后建造地板
        builder.makeFloor();
    }

}

Client拿到产品Product (Room)

public class Client {

    public static void main(String[] args) {
        //工人建造Product
        Builder build = new RoomBuilder();

        Director director = new Director();
        //Director指挥工人的工作顺序
        director.command(build);
        //最终将Product交给Client
        Room room = build.returnRoom();

        System.out.println(room.toString());
    }
}

3.第二种内部类的实现方式(目前通用的写法)

public class Person {

    private String name;
    private String age;
    private String weight;
    private String height;

    private Person(Builder builder){
        this.name = builder.name;
        this.age = builder.age;
        this.weight = builder.weight;
        this.height = builder.height;
    }

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

    public String getWeight() {
        return weight;
    }

    public String getHeight() {
        return height;
    }

    static class Builder{
        private String name;
        private String age;
        private String weight;
        private String height;

        public Person build(){
            return new Person(this);
        }

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

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

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

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

    }

    @Override
    public String toString() {
        return "{\"name\":\"" + name + "\",\"age\":\"" + age
                + "\",\"weight\":\"" + weight + "\",\"height\":\"" + height
                + "\"}";
    }

}

声明内部类,Person的构造器对外隐藏,在内部类的创建Person的成员变量时,返回this,实现链式调用。
把自己学习设计模式的过程记成笔记,方便自己随时查看,如有错误,欢迎指出,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值