构造者模式
构造者模式建议将对象构造代码从产品类中抽取出来, 并将其放在一个名为构造者的独立对象中
构建者模式也是用来创建对象,但是相对于工厂模式来说,建造者模式适用于构建复杂对象,而工厂模式适用于创建对象的封装和管理,也就是说,构建者模式可以根据个人需求创建对象,根据个人需求决定对对象的某个属性是否进行赋值,以及对对象的某个属性进行不同的赋值,这是和工厂的主要区别
构建者主要分为以下几个对象:
- 抽象构造者(Builder)
package com.lhl.build;
/**
* 抽象构造者
* @author Liu Hanlin
* @create 2024-09-22 23:47
*/
public abstract class Builder {
// 创建产品
protected Product product = new Product();
/**
* 构建相同部分
*/
public void buildCommon(){
this.product.setCommon("构造器设置公共部分");
}
/** 可变构造部分 */
public abstract void buildA();
public abstract void buildB();
// 返回对象实例
public Product getInstance(){
return this.product;
}
}
-
具体构造者(ConcreteBuilder)
- 带指挥者的具体构造者
package com.lhl.build; /** * 具体构造者 * @author Liu Hanlin * @create 2024-09-22 23:49 */ public class ConcreteBuilder extends Builder{ @Override public void buildA() { this.product.setPartA("构造器设置部分A"); } @Override public void buildB() { this.product.setPartB("构造器设置部分B"); } }
- 不带指挥者的具体构造者,设置完产品的属性后,继续返回此构造者
package com.lhl.chainbuild.build; /** * 具体构造者 * @author 刘翰林 * @create 2024-09-22 23:49 */ public class ChainBuilder extends Builder { @Override public Builder buildA() { this.product.setPartA("构造器设置部分A"); return this; } @Override public Builder buildB() { this.product.setPartB("构造器设置部分B"); return this; } }
-
产品(Product)
package com.lhl.build;
/**
* 产品
* @author Liu Hanlin
* @create 2024-09-22 23:47
*/
public class Product {
/** 产品公共部分 */
private String common;
/** 产品部分A */
private String partA;
/** 产品部分B */
private String partB;
@Override
public String toString() {
return "Product{" +
"common='" + common + '\'' +
", partA='" + partA + '\'' +
", partB='" + partB + '\'' +
'}';
}
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getCommon() {
return common;
}
public void setCommon(String common) {
this.common = common;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
}
- 指挥者(Director)【可有可无】
package com.lhl.build;
/**
* 指挥者【不是必须的,可以由我们自己来充当指挥者】
* @author Liu Hanlin
* @create 2024-09-22 23:47
*/
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public Director(){
}
public void setBuilder(Builder builder){
this.builder = builder;
}
/**
* 组装产品返回
* @return
*/
public Product Construct(){
this.builder.buildCommon();
this.builder.buildA();
this.builder.buildB();
return this.builder.getInstance();
}
}
如上,我们就完成了构造者模式的带指挥者和不带指挥者的两种类型,我们现在可以进行测试一下
package com.lhl;
import com.lhl.build.ConcreteBuilder;
import com.lhl.build.Director;
import com.lhl.build.Product;
import com.lhl.chainbuild.build.Builder;
import com.lhl.chainbuild.build.ChainBuilder;
/**
* 构建者模式
* @author 刘翰林
* @create 2024-09-20 0:46
*/
public class Main {
public static void main(String[] args) {
System.out.println("有指挥者:");
buildDemo();
System.out.println("*******************************");
System.out.println("无指挥者:");
chainBuildDemo();
}
/**
* 构造者模式链式调用【无指挥者,指挥权交给客户端】构建示例
*/
public static void chainBuildDemo(){
Builder builder = new ChainBuilder();
com.lhl.chainbuild.build.Product instance = builder.buildCommon()
.buildA()
.buildB()
.getInstance();
System.out.println(instance);
}
/**
* 有指挥者对象的构造器模式示例
*/
public static void buildDemo(){
Director director = new Director(new ConcreteBuilder());
Product construct = director.Construct();
System.out.println(construct);
}
}
输出结果如下:可以看到都是可以正常使用的
此外,值得注意的是,我们在导入了Lombok依赖后,可以直接使用@Builder注解帮助我们创建此类的构造者
具体示例如下:
- 导入Lombok依赖
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version> <!-- Use the latest version available -->
</dependency>
- 定义产品类,给产品类添加build注解
package com.lhl.lombokbuild;
import lombok.Builder;
import lombok.Data;
/**
* 产品
* @author Liu Hanlin
* @create 2024-09-22 23:47
*/
@Data
@Builder
public class Product {
/** 产品公共部分 */
private String common;
/** 产品部分A */
private String partA;
/** 产品部分B */
private String partB;
}
- 添加测试方法,
public static void lombokBuildDemo(){
ProductBuilder builder = com.lhl.lombokbuild.Product.builder();
builder.partA("lombokA");
builder.partB("lombokB");
builder.common("lombokCommon");
com.lhl.lombokbuild.Product product = builder.build();
System.out.println(product);
}
生成对象正常输出: