构造者模式多种实现方式

构造者模式

构造者模式建议将对象构造代码从产品类中抽取出来, 并将其放在一个名为构造者的独立对象中

​ 构建者模式也是用来创建对象,但是相对于工厂模式来说,建造者模式适用于构建复杂对象,而工厂模式适用于创建对象的封装和管理,也就是说,构建者模式可以根据个人需求创建对象,根据个人需求决定对对象的某个属性是否进行赋值,以及对对象的某个属性进行不同的赋值,这是和工厂的主要区别

​ 构建者主要分为以下几个对象:

  • 抽象构造者(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);
    }

生成对象正常输出:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值