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());
}
}