什么是建造者模式?
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
作用:
把复杂对象的构建过程和细节封装起来,用户只需指定需要建造的类型就可以得到它们,方便复用对象。
UML原理图:
实例:
/**
* 产品类
*/
public class Product {
private List<String> parts=new ArrayList<>();
public void Add(String part){
parts.add(part);
}
public void show(){
System.out.println("产品创建");
for (String part : parts) {
System.out.println(part);
}
}
}
/**
* 建造者抽象类
*/
public abstract class Builder {
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
/**
* 具体建造者类
*/
public class ConcreteBuild1 extends Builder {
private Product product=new Product();
@Override
public void BuildPartA() {
product.Add("部件A");
}
@Override
public void BuildPartB() {
product.Add("部件B");
}
@Override
public Product GetResult() {
return product;
}
}
/**
* 具体建造者
*/
public class ConcreteBuild2 extends Builder {
private Product product=new Product();
@Override
public void BuildPartA() {
product.Add("部件X");
}
@Override
public void BuildPartB() {
product.Add("部件Y");
}
@Override
public Product GetResult() {
return product;
}
}
/**
* 指挥者
*/
public class Director {
public void Construct(Builder builder){
builder.BuildPartA();
builder.BuildPartB();
}
}
public static void main(String[] args){
Director director=new Director();
Builder b1=new ConcreteBuild1();
Builder b2=new ConcreteBuild2();
director.Construct(b1);
Product product1=b1.GetResult();
product1.show();
director.Construct(b2);
Product product2=b2.GetResult();
product2.show();
}
去掉指挥者使用静态内部类实现建造者,链式调用方式配置参数,构建产品对象。
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
private String courseQA;
public Course(CourseBuilder builder){
this.courseName=builder.courseName;
this.coursePPT=builder.coursePPT;
this.courseVideo=builder.courseVideo;
this.courseArticle=builder.courseArticle;
this.courseQA=builder.courseQA;
}
@Override
public String toString() {
return "Course{" +
"courseName='" + courseName + '\'' +
", coursePPT='" + coursePPT + '\'' +
", courseVideo='" + courseVideo + '\'' +
", courseArticle='" + courseArticle + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
public static class CourseBuilder{
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
private String courseQA;
public CourseBuilder buildCourseName(String courseName){
this.courseName=courseName;
return this;
}
public CourseBuilder buildCoursePPT(String coursePPT){
this.coursePPT=coursePPT;
return this;
}
public CourseBuilder buildCourseVideo(String courseVideo){
this.courseVideo=courseVideo;
return this;
}
public CourseBuilder buildCourseArticle(String courseArticle){
this.courseArticle=courseArticle;
return this;
}
public CourseBuilder buildCourseQA(String courseQA){
this.courseQA=courseQA;
return this;
}
public Course build(){
return new Course(this);
}
}
}
public static void main(String[] args){
Course course=new Course.CourseBuilder().buildCourseName("设计模式")
.buildCourseArticle("设计模式手记")
.buildCoursePPT("PPT精讲")
.buildCourseVideo("java设计模式视频")
.buildCourseQA("问答")
.build();
System.out.println(course);
}