设计模式-构建者模式

定义:

将一个复杂对象的构建与表示分离。使用相同的构建过程可以创建不同的表示。

类型:创建类型

应用场景

  1. 一个对象有很复杂的结构(很多属性)
  2. 想把对象的创建与对象的使用分离

优点

  1. 封装性好,创建与使用分离
  2. 扩展性好,构建类之间是相互独立的,一定程度上解耦

缺点

  1. 类爆炸,对应多个builder类
  2. 产品内部发生变化,构建者的build也要修改

源码应用的场景

  1. JDK StringBuilder与StringBuffer采用的就是构建者模式
  2. GUAVA包中ImmutableSet就是典型的构建者模式应用
public abstract class ImmutableSet<E> extends ImmutableCollection<E> implements Set<E> {
	public static class Builder<E> extends ImmutableCollection.Builder<E> {
		@Override
	    @CanIgnoreReturnValue
	    public Builder<E> add(E element) {
	      checkNotNull(element);
	      copyIfNecessary();
	      impl = impl.add(element);
	      return this;
	    }
		@Override
	    public ImmutableSet<E> build() {
	      forceCopy = true;
	      impl = impl.review();
	      return impl.build();
	    }
	}

}

demo

UML

目录结构
两个版本,第一个是通过接口、实现类形式,第二个是内部类实现
两个版本
v1-Course

package creational.builder.v1;

public class Course {
    private String name;
    private String QA;
    private String desc;

    public String getName() {
        return name;
    }

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

    public String getQA() {
        return QA;
    }

    public void setQA(String QA) {
        this.QA = QA;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Course{" +
                "name='" + name + '\'' +
                ", QA='" + QA + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

v1-CouseBuilderI

package creational.builder.v1;

public interface CouseBuilderI {
    CouseBuilderI builderName(String name);
    CouseBuilderI builderQA(String QA);
    CouseBuilderI builderDesc(String desc);
    Course build();
}

v1-CouseActuralBuilder

package creational.builder.v1;

public class CouseActuralBuilder implements  CouseBuilderI {

    private Course course;

    public CouseActuralBuilder() {
        this.course = new Course();
    }

    @Override
    public CouseBuilderI builderName(String name) {
        this.course.setName(name);
        return this;
    }

    @Override
    public CouseBuilderI builderQA(String QA) {
        this.course.setQA(QA);
        return this;
    }

    @Override
    public CouseBuilderI builderDesc(String desc) {
        this.course.setDesc(desc);
        return this;
    }

    @Override
    public Course build(){
        return  this.course;
    }
}

v1-Test

package creational.builder.v1;

public class Test {
    public static void main(String[] args) {
        CouseBuilderI couseBuilder = new CouseActuralBuilder();
        Course course = couseBuilder.builderName("zz").builderDesc("desc").builderQA("QA").build();
        System.out.println(course);


    }
}

v2-Course

package creational.builder.v2;

public class Course {
    private String name;
    private String QA;
    private String desc;




    public static class CourseBuilder{
        private Course course;
        public CourseBuilder(){
            this.course=new Course();
        }

        public CourseBuilder builderName(String name) {
            this.course.setName(name);
            return this;
        }

        public CourseBuilder builderQA(String QA) {
            this.course.setQA(QA);
            return this;
        }

        public CourseBuilder builderDesc(String desc) {
            this.course.setDesc(desc);
            return this;
        }

        public Course build(){
            return  this.course;
        }


    }








    public String getName() {
        return name;
    }

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

    public String getQA() {
        return QA;
    }

    public void setQA(String QA) {
        this.QA = QA;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Course{" +
                "name='" + name + '\'' +
                ", QA='" + QA + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

v2-Test

package creational.builder.v2;

import com.google.common.collect.ImmutableSet;

public class Test {
    public static void main(String[] args) {
        Course course = new Course.CourseBuilder().builderName("zz").builderDesc("desc").builderQA("QA").build();
        System.out.println(course);

        new StringBuilder();

        ImmutableSet<String> immutableSet = new ImmutableSet.Builder<String>().add("zz").build();
        System.out.println(immutableSet);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值