建造者模式(代码片段)

weixk weixk     2022-12-10     371

关键词:

一、建造者模式介绍

1、定义与类型

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
类型:创建型

2、使用场景

如果一个对象有非常复杂的内部结构(很多属性)
想把复杂对象的创建和使用分离

3、优点

封装性好,创建和使用分离
扩展性好、建造类之间独立、一定程度上解耦

4、缺点

产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大

二、代码示例

1、v1版本:

课程类:

public class Course 
    private String courseName;
    private String coursePPT;
    private String courseVideo;
    private String courseArticle;

    //question & answer
    private String courseQA;

    public String getCourseName() 
        return courseName;
    

    public void setCourseName(String courseName) 
        this.courseName = courseName;
    

    public String getCoursePPT() 
        return coursePPT;
    

    public void setCoursePPT(String coursePPT) 
        this.coursePPT = coursePPT;
    

    public String getCourseVideo() 
        return courseVideo;
    

    public void setCourseVideo(String courseVideo) 
        this.courseVideo = courseVideo;
    

    public String getCourseArticle() 
        return courseArticle;
    

    public void setCourseArticle(String courseArticle) 
        this.courseArticle = courseArticle;
    

    public String getCourseQA() 
        return courseQA;
    

    public void setCourseQA(String courseQA) 
        this.courseQA = courseQA;
    

    @Override
    public String toString() 
        return "Course" +
                "courseName=‘" + courseName + ‘‘‘ +
                ", coursePPT=‘" + coursePPT + ‘‘‘ +
                ", courseVideo=‘" + courseVideo + ‘‘‘ +
                ", courseArticle=‘" + courseArticle + ‘‘‘ +
                ", courseQA=‘" + courseQA + ‘‘‘ +
                ‘‘;
    

课程的builder类:

public class CourseActualBuilder extends 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 buildCourseQA(String courseQA) 
        course.setCourseQA(courseQA);
    

    @Override
    public Course makeCourse() 
        return course;
    

教练(代理)类:

public class Coach 
    private CourseBuilder courseBuilder;

    public void setCourseBuilder(CourseBuilder courseBuilder) 
        this.courseBuilder = courseBuilder;
    

    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.buildCourseQA(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版本:

课程类、课程内部的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);
        
    

测试类:

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);
    

类图:
技术图片

三、源码示例

1、StringBuilder类(StringBuffer同理,只是增加了同步方法)

技术图片
技术图片

2、guava中的ImmutableSet类

技术图片
技术图片

用法:

Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build();

3、spring-beans中的BeanDefinitionBuilder类

技术图片

4、mybatis

SqlSessionFactoryBuilder类
技术图片

xmlConfigBuilder类
技术图片












设计模式之建造者模式(创建型)(代码片段)

模式定义建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法。所谓建造者模式就是将组件和组件的组件过程分开,然后一步一步建造一个复杂的对象。所以建造者模式又叫生成器模式。建造者... 查看详情

建造者模式(代码片段)

建造者模式标签(空格分隔):设计模式什么是建造者模式Builder模式,建造者模式也叫生成器模式,是GoF提出的23种设计模式中的一种,是一种对象的创建型模式,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽... 查看详情

设计模式随笔:建造者模式(代码片段)

建造者模式(BuilderDesign)定义  把一个复杂对象的构建和表示分离开,使同样的构建构成可以创建不同的表示(官方的定义)UML图说明   抽象建造者接口(Builder):抽象定义的建造者(非必须的)导演角色类(Director... 查看详情

设计模式——建造者模式(代码片段)

设计模式(九)——建造者模式新专题:设计模式,我会在博客(http://www.hollischuang.com)及微信公众号(hollischuang)同步更新,欢迎共同学习。本文主要介绍创建型模式的最后一种————建造者模式。概念建造者模式(英:BuilderPatt... 查看详情

建造者模式(代码片段)

1、建造者模式1.1、什么是建造者模式  建造者模式是将一个产品的内部表象与产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。 1.1.1、内部表象  产品通常会有不同的组成成分作为产... 查看详情

设计模式——建造者模式(代码片段)

什么是建造者建造者模式实际上是常用的设计模式。顾名思义,builder的意思是建造者或者建筑工人,谈到建造自然会想到楼房。楼房是千差万别的,楼房的外形、层数、内部房间的数量、房间的装饰等等都不一样,但是对于建... 查看详情

设计模式—建造者模式(builder)(代码片段)

title:设计模式—建造者模式建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。我们获得一... 查看详情

设计模式----建造者模式(代码片段)

建造者模式介绍角色代码演示通过反射创建建造者对象优点缺点适用场景总结参考文章介绍建造者模式(BuilderPattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种... 查看详情

gof设计模式(05)建造者模式(代码片段)

简介一、定义1、概念建造者模式(Builder):将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。2、理解将客户端与包含多个组成部分的复杂对象的创建过程... 查看详情

建造者模式(代码片段)

...试题汇总 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合... 查看详情

设计模式学习系列——建造者模式(代码片段)

 建造者模式  建造者模式(BuilderPattern)使用多个简单的对象一步一步构建成一个复杂的对象。  优点: 1、建造者独立,易扩展。2、便于控制细节风险。  缺点: 1、产品必须有共同点,范围有限制。2、如内... 查看详情

设计模式之建造者模式(代码片段)

设计模式之建造者模式  建造者模式(BuilderPattern)也叫生成器模式,定义:Separatetheconstructionofcomplexobjectfromitsrepresentationsothatthesameconstructionprocesscancreatedifferentrepresentations.(将一个复杂的对象的构建与它的表示 查看详情

06建造者模式builder(代码片段)

一、什么是建造者模式  Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。  Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过... 查看详情

设计模式之:建造者模式builderpattern的实现(代码片段)

建造者模式相较于工厂模式,用于创建复杂的对象;使用的技术:继承、抽象类、多态、配置文件、反射;建造者模式的设计原则:面向抽象类编程,符合依赖倒置原则;通过配置文件生成具体建造者,替代抽象建造者,符合里... 查看详情

设计模式之建造者模式(代码片段)

建造者模式1.简要概述2.模式结构3.实现代码4.优点好处5.缺点弊端6.应用场景7.应用示例1.简要概述建造者模式也可以叫做生成器模式。建造者模式就是说首先封装一个对象的构造过程,然后按照这个过程步骤去构建这个对象实... 查看详情

设计模式之建造者模式(代码片段)

本文由老王家组装电脑引出——建造者设计模式,详细介绍建造者模式的基本概念和实现代码,为了便于理解建造者模式,我们会对实际应用中的典型案例进行介绍。最后对比工厂模式和建造者模式之间的区别,让我们在实际使... 查看详情

死磕设计模式—建造者模式(代码片段)

前言(八问知识体系)  1.1.简介什么是建造模式?1.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示2.建造者模式是一步一步创建一个复杂的对象,建造者模式注重的是一步一步的创建复... 查看详情

builderpattern建造者模式(代码片段)

建造者模式1.定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常有4个角色Person抽象类:定义模板方法及基本方法publicabstractclassAbstractPersonprivatebooleancanSwim=true;publicvoidsetCanSwim(... 查看详情