建造者模式
适用场景
优点
缺点
建造者模式与工厂模式的比较
Golang Demo
Java Demo
UML

补充另一个版本的Java/Scala Demo 以及源码解析
Java Demo_
Scala Demo
UML_
源码解析
Last updated

Last updated
package builder
type Builder interface {
buildCourseName(courseName string) Builder
buildCoursePPT(coursePPT string) Builder
buildCourseVideo(courseVideo string) Builder
buildCourseArticle(courseArticle string) Builder
buildCourseQA(courseQA string) Builder
build() Course
}package builder
type Course struct {
courseName string
coursePPT string
courseVideo string
courseArticle string
courseQA string
}
type CourseBuilder struct {
course Course
}
func NewCourseBuilder() *CourseBuilder {
return &CourseBuilder{}
}
func (c *CourseBuilder) buildCourseName(courseName string) Builder {
c.course.courseName = courseName
return c
}
func (c *CourseBuilder) buildCoursePPT(coursePPT string) Builder {
c.course.coursePPT = coursePPT
return c
}
func (c *CourseBuilder) buildCourseVideo(courseVideo string) Builder {
c.course.courseVideo = courseVideo
return c
}
func (c *CourseBuilder) buildCourseArticle(courseArticle string) Builder {
c.course.courseArticle = courseArticle
return c
}
func (c *CourseBuilder) buildCourseQA(courseQA string) Builder {
c.course.courseQA = courseQA
return c
}
func (c *CourseBuilder) build() Course {
return c.course
}package builder
import (
"fmt"
"testing"
)
func TestBuilder(t *testing.T) {
course := NewCourseBuilder().
buildCourseName("golang").
buildCourseArticle("golang note").
buildCoursePPT("golang ppt").build()
fmt.Println(course)
}package tech.selinux.design.pattern.creational.builder;
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
//question & answer
private String courseQA;
public Course(CourseBuilder courseBuilder) {
this.courseName = courseBuilder.courseName;
this.coursePPT = courseBuilder.coursePPT;
this.courseVideo = courseBuilder.courseVideo;
this.courseArticle = courseBuilder.courseArticle;
this.courseQA = courseBuilder.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;
//question & answer
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);
}
}
}package tech.selinux.design.pattern.creational.builder;
public class Test {
public static void main(String[] args) {
// 链式调用
Course course =
new Course.CourseBuilder()
.buildCourseName("Java pattern")
.buildCoursePPT("Java pattern PPT")
.buildCourseVideo("Java pattern video")
.build();
System.out.println(course);
}
}