建造者模式笔记

建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示
建造者模式的4个角色:
 1. Product(产品)
 2. Builder(抽象构建者):创建一个产品Product对象的各个部件指定的接口/抽象类
 3. ConcreteBuilder(具体构建者):实现接口,构建和装配各个部件
 4. Director(指挥者):构建一个使用Builder接口的对象。主要用于创建一个复杂的对象,主要有两个作用:
     1. 隔离客户和产品对象的生产过程
     2. 负责控制产品对象的生产过程

在这里插入图片描述

1.创建一个指挥者,指挥者用于指挥建造产品的流程,流程对于某大类下的各种产品是一致的
2.创建一个建造者,该建造者建造的产品是某大类下特定的产品,比如房子中的别墅,汽车中的劳斯莱斯 
3.指挥者通过指挥建造者去建造特定的产品,所以只需要创建一个指挥者并调用其方法,而不需要知道具体的产品建造流程

代码实现:

/**
 * 产品,Product
 */
public class House {
    private String basic;
    private String wall;
    private String roofed;

    public String getBasic() {
        return basic;
    }
    public void setBasic(String basic) {
        this.basic = basic;
    }
    public String getWall() {
        return wall;
    }
    public void setWall(String wall) {
        this.wall = wall;
    }
    public String getRoofed() {
        return roofed;
    }
    public void setRoofed(String roofed) {
        this.roofed = roofed;
    }
}
/**
 * 抽象的建造者
 */
public abstract class HouseBuilder {
    //创建产品对象
    protected House house = new House();
    //建造流程的抽象方法
    public abstract void buildBasic();
    public abstract void buildWall();
    public abstract void buildRoof();
    //返回建造好的房子
    public House buildHouse(){
        return house;
    }
}
public class CommonHouse extends HouseBuilder{
    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基");
        house.setBasic("普通房子的地基");
    }
    @Override
    public void buildWall() {
        System.out.println("普通房子砌墙");
        house.setWall("普通房子的墙");
    }
    @Override
    public void buildRoof() {
        System.out.println("普通房子盖房顶");
        house.setRoofed("普通房子的屋顶");
    }
}

/**
 * 指挥者,这里动态地指定建造流程,返回产品
 **/
public class HouseDirector {
    HouseBuilder houseBuilder = null;
    //方法1. 通过构造器传入建造者对象
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }
    //方法2. 通过setter传入建造者对象
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }
    //如何处理建造房子的流程,交给指挥者
    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWall();
        houseBuilder.buildRoof();
        return houseBuilder.buildHouse();
    }
}
public class Client {
    public static void main(String[] args) {
        //盖普通房子
        CommonHouse commonHouse = new CommonHouse();
        //准备建造房子的指挥者
        HouseDirector houseDirector = new HouseDirector(commonHouse);
        //完成盖房子,返回产品
        House house = houseDirector.constructHouse();
    }
}
建造者模式在当创建复杂对象时推荐使用,即如果一个对象有很多成员变量需要赋值,则推荐使用建造者模式

建造者模式变种:

参考:1. https://blog.csdn.net/bicheng4769/article/details/80988996
     2. https://www.jianshu.com/p/afe090b2e19c
public class Person {
    private int id;
    private final String name;  
    private final String gender; 
    private Date birth;
    private String job;
    private double height;
    private double weight;
    private String address;

    private Person(Builder builder) {
        this.name = builder.name;
        this.gender = builder.gender;
        this.birth = builder.birth;
        this.job = builder.job;
        this.height = builder.height;
        this.weight = builder.weight;
        this.address = builder.address;
    }

    public static class Builder{
        private final String name;
        private final String gender;
        private Date birth;
        private String job;
        private double height;
        private double weight;
        private String address;

        public Builder(String name,String gender) {
            this.name = name;
            this.gender = gender;
        }
        public Builder birth(Date birth){
            this.birth = birth;
            return this;
        }
        public Builder job(String job){
            this.job = job;
            return this;
        }
        public Builder height(double height){
            this.height = height;
            return this;
        }
        public Builder weight(double weight){
            this.weight = weight;
            return this;
        }
        public Builder address(String address){
            this.address = address;
            return this;
        }

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

创建Person对象时:
 Person person = new Person.Builder("jarvis","male")
            .height(178).weight(61).job("程序员")
            .build();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值