设计模式---【建造者模式】

xiaoxiao2025-04-28  25

目录

前言

一、定义

二、结构图

三、优缺点

四、代码


 

前言

此文章记录自己所学,不对之处欢迎纠正。文中有些字段、图片通过书籍摘抄而来,非常感谢原作者。

一、定义

建造者模式又被称为生成器模式。此模式不是专注于一个简单的产品,而是专注于一个由多个部件、产品组件而成的复杂产品。例如:电脑,电脑由cpu、显卡、键盘、鼠标、内存等构成,这些属于部件(单一的产品),而由这些部件所组装而成的电脑则是一个完整的产品。建造者模式所解决的问题就是:如何将这些部件(可能包含一定的顺序)组件成电脑(完整的产品),让用户能够使用。

二、结构图

Bulider:抽象建造者。包含构建产品各个组件方法,同时包含一个getResult()方法(返回产品对象)

ConcreteBuilder:具体建造者。实现Bulider接口,实现各个部件的具体构造和装配方法。

Product:产品类。被构建的复杂对象,包含多个组件。

Director:指挥者。复杂安排产品对象的建造次序。

三、优缺点

优点 客户端不必知道产品内部组成的细节,产品本身与产品的创建过程进行了解耦,相同的创建过程可以创建不同的产品对象。增加新的具体建造者不需修改原有项目的代码,因为每个具体建造者都是相对独立的。能够更加精准的控制产品的创建过程。(进行链式调用后)可以精确的控制到某个产品需要哪些部件构成,完全由客户端来决定。 缺点 产品需要具有较多的共同点,其组成部分相似。如果差异很大(很多组成部分不同),不适合使用建造者模式如果产品内部的组件变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化。

四、代码

1.v1版

/** * 抽象接口 * 构建课程的各个部件、返回课程对象工厂方法 */ public interface CourseBuilder { /** * 第一步 构建课程名称 * 具体由子类实现 * @param courseName */ void buildCourseName(String courseName); /** * 第二步 构建课程PPT * 具体由子类实现 * @param coursePPT */ void buildCoursePPT(String coursePPT); /** * 第三步 构建课程视频 * 具体由子类实现 * @param courseVideo */ void buildCourseVideo(String courseVideo); /** * 第四步 构建课程手记 * 具体由子类实现 * @param courseArticle */ void buildCourseArticle(String courseArticle); /** * 第五步 构建课程问答 * 具体由子类实现 * @param courseQA */ void buildCoureseQA(String courseQA); /** * 第六步 返回一个构建课程的方法,获得构建好的课程 * @return */ Course makeCourse(); }

 

/** * 具体建造者 */ public class CourseActualBuilder implements CourseBuilder { /** 创建课程实例 */ private Course course = new Course(); /** 构建组件【构建课程】 */ @Override public void buildCourseName(String courseName) { course.setCourseName(courseName); } @Override public void buildCoursePPT(String coursePPT) { course.setCoursePPT(coursePPT); } @Override public void buildCourseVideo(String courseVideo) { course.setCourseVideo(courseVideo); } @Override public void buildCourseArticle(String courseArticle) { course.setCourseArticle(courseArticle); } @Override public void buildCoureseQA(String courseQA) { course.setCourseQA(courseQA); } /** * 返回构建成功的课程 * @return */ @Override public Course makeCourse() { return course; } } /** * 课程对象 */ public class Course { /** 课程名称 */ private String courseName; /** 课程ppt */ private String coursePPT; /** 课程视频 */ private String courseVideo; /** 课程手机 */ private String courseArticle; /** 课程问题、答案 */ private String courseQA; getter、setter方法..... @Override public String toString() { return "Course{" + "courseName='" + courseName + '\'' + ", coursePPT='" + coursePPT + '\'' + ", courseVideo='" + courseVideo + '\'' + ", courseArticle='" + courseArticle + '\'' + ", courseQA='" + courseQA + '\'' + '}'; } }

 

/** * 指挥类 */ public class Director { /** 注入抽象类【定义创建的课程】 */ private CourseBuilder courseBuilder; public void setCourseBuilder(CourseBuilder courseBuilder) { this.courseBuilder = courseBuilder; } /** * 构建课程 * @param courseName * @param coursePPT * @param courseVideo * @param courseArticle * @param courseQA * @return */ public Course makeCourse(String courseName, String coursePPT, String courseVideo, String courseArticle,String courseQA){ this.courseBuilder.buildCourseName(courseName); this.courseBuilder.buildCoursePPT(coursePPT); this.courseBuilder.buildCourseVideo(courseVideo); this.courseBuilder.buildCourseArticle(courseArticle); this.courseBuilder.buildCoureseQA(courseQA); return this.courseBuilder.makeCourse(); } } /** * 测试类 */ public class Test { public static void main(String[] args) { //声明一个构建课程的具体实例 CourseBuilder courseBuilder = new CourseActualBuilder(); //构建 Coach coach = new Coach(); //将构建课程定义的实例注入 coach.setCourseBuilder(courseBuilder); //构建完成 Course course = coach.makeCourse("Java设计模式", "java设计模式PPT", "java设计模式视频", "java设计模式手记", "java设计模式问答"); System.out.println(course); } }

 2.v2版(链式调用)

/** * 课程对象 * 通过内部类进行链式调用 */ public class Course { /** 课程名称 */ private String courseName; /** 课程ppt */ private String coursePPT; /** 课程视频 */ private String courseVideo; /** 课程手记 */ private String courseArticle; /** 课程问题、答案 */ 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 + '\'' + '}'; } /** * 内部类 链式调用【返回this】 */ public static class CourseBuilder{ /** 课程名称 */ private String courseName; /** 课程ppt */ 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 class Test { public static void main(String[] args) { Course course = new Course.CourseBuilder().buildCourseName("java设计模式名称").buildCoursePPT("java设计模式PPT").buildCourseVideo("java设计模式视频").build(); System.out.println(course); } }

 

转载请注明原文地址: https://www.6miu.com/read-5029330.html

最新回复(0)