java25种设计模式之生成器模式(建造者模式)

1、定义

生成器模式(英:Builder Pattern)又名建造模式的一种设计模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

2、适用场景

相同的方法,不同的执行顺序,产生不同的事件结果。
对各部件或零件,都可以配到一个对象中,但是产生的运行结果又不相同时。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的结果,这个时候使用创建者模式非常合适。
当初始化一个对象特别复杂,如参数多,且很多参数都有默认值时(一个类有多个构造函数的时候,可以考虑使用建造者模式)
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
需要生成的对象内部属性本身相互依赖。

3、优缺点

优点
封装性好,创建和使用分离
扩展性好、建造类之间独立、一定程度上解耦
缺点
产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大,所以需要精心设计

4、主要角色:

          Product(产品角色):一个具体的产品对象
          Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类
          ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
         Director(指挥者):构建一个使用Builder的对象,它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程

5、 实例

1 product 产品角色(一个普通的对象)

/**
 * @author weisn
 * 用户信息(product 产品角色)
 */
public class UserInfo {
    private String id;
    private String name;
    private String age;
    private String phone;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

2 builder构造器

创建一个Product对象的各个部件指定的接口/抽象类

/**
 * @Description: 构造器
 * @ClassName: UserInfoBuilder
 * @Author: weisn
 * @Date: 2023/3/6 10:32
 * @Version: 1.0
 */
public abstract class UserInfoBuilder {
    private UserInfo userInfo = new UserInfo();

    protected UserInfo getUserInfo() {
        return userInfo;
    }

    public abstract UserInfoBuilder buildId(String id);
    public abstract UserInfoBuilder buildName(String name);
    public abstract UserInfoBuilder buildAge(String age);
    public abstract UserInfoBuilder buildPhone(String phone);
    public UserInfo build() {
        return userInfo;
    }
}

3 ConcreteBuilder(具体建造者)

实现接口,构建和装配各个部件这里就可以提现不同的

/**
 * @Description: 建造者
 * @ClassName: UserConcreteBuilder
 * @Author: weisn
 * @Date: 2023/3/6 10:42
 * @Version: 1.0
 */
public class UserConcreteBuilder extends UserInfoBuilder{
    private UserInfo userInfo = new UserInfo();

    public void builderId(String id) {
        userInfo.setId(id);
    }

    public void builderName(String name) {
        userInfo.setName(name);
    }

    public void builderAge(String age) {
        userInfo.setAge(age);
    }

    public void builderPhone(String phone) {
        userInfo.setPhone(phone);
    }

    public UserInfo builber() {
        return userInfo;
    }
}

4 ConcreteBuilder(具体建造者)

实现接口,构建和装配各个部件

/**
 * @Description: 建造者
 * @ClassName: UserConcreteBuilder
 * @Author: weisn
 * @Date: 2023/3/6 10:42
 * @Version: 1.0
 */
public class UserConcreteBuilder extends UserInfoBuilder{

    public UserInfoBuilder buildId(String id) {
        this.getUserInfo().setId(id);
        return this;
    }

    public UserInfoBuilder buildName(String name) {
        this.getUserInfo().setName(name);
        return this;
    }

    public UserInfoBuilder buildAge(String age) {
        this.getUserInfo().setAge(age);
        return this;
    }

    public UserInfoBuilder buildPhone(String phone) {
        this.getUserInfo().setPhone(phone);
        return this;
    }
}

5 Director(指挥者)

构建一个使用Builder的对象,它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程

/**
 * @Description: 指导建造者建造(指挥者)
 * @ClassName: UserInfoDirector
 * @Author: weisn
 * @Date: 2023/3/6 11:29
 * @Version: 1.0
 */
public class UserInfoDirector {
    private UserInfoBuilder userInfoBuilder;

    public UserInfoDirector(UserInfoBuilder userInfoBuilder) {
        this.userInfoBuilder = userInfoBuilder;
    }
    public UserInfo BuilderUserInfo(String id,String name,String age,String phone) {
        return userInfoBuilder
                .buildId(id)
                .buildName(name)
                .buildAge(age)
                .buildPhone(phone)
                .build();
    }

}

6 测试

/**
 * @Description:
 * @ClassName: Test
 * @Author: weisn
 * @Date: 2023/3/6 15:59
 * @Version: 1.0
 */
public class Test {
    public static void main(String[] args) {
        // 建造者
        UserInfoBuilder builder = new UserConcreteBuilder();
        // 指导建造者建造(指挥者)
        UserInfoDirector director = new UserInfoDirector(builder);
        UserInfo userInfo = director.BuilderUserInfo("1", "张三", "12", "152222");
        System.out.println(userInfo.toString());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值