【设计模式In Java】四、建造者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CL_YD/article/details/87926362

建造者模式

定义

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

场景

当一个对象的构造过程非常复杂,比如有特别多的属性,或者构造时有特定的顺序,甚至是属性之间有特殊的依赖关系等,这个时候可以使用构建者模式来创建对象。

假设现在要创建计算机学院各个专业的课程表,每个课程表有七天需要安排,如果单独创建,无疑是非常麻烦的:要么用一个庞大的构造函数,要么声明对象后一个个set,但这两种方法都不是特别优雅,每个课程表的创建分散无法控制。

UML类图

在这里插入图片描述

代码

builder
示例:

public class TestBuilder {

    @Test
    public void test(){
        System.out.println(new TimetableDirector(new ComputerScienceTimetableBuilder()).buildTimetable().toString());
        System.out.println();
        System.out.println(new TimetableDirector(new SoftwareEngineeringTimetableBuilder()).buildTimetable().toString());
        /*
        Sunday: 
        Monday: Spoken English
        Tuesday: Advanced mathematics
        Wednesday: College Physics
        Thursday: C Language
        Friday: Sports
        Saturday: Situation and Policy
        
        Sunday: 
        Monday: Sports
        Tuesday: Discrete Mathematics
        Wednesday: College Physics
        Thursday: Professional English
        Friday: Probability Statistics
        Saturday: Situation and Policy
         */
    }

}

简化

这样子看起来,构建者模式和抽象工厂方法简直如出一辙,唯一的区别是加了Director角色处理创建顺序,或者处理属性之间的依赖关,在一定的场景中可以用抽象工厂+模板方法模式来搞定,更多情况下使用的是简化版本的Builder模式。

首先可以省略掉Director类,把构造过程放在各自的Builder或者放在抽象类中,用模板方法模式来代替:

public abstract class TimetableBuilder {

    protected Timetable timetable = new Timetable();

    public abstract void sunday();
    public abstract void monday();
    public abstract void tuesday();
    public abstract void wednesday();
    public abstract void thursday();
    public abstract void friday();
    public abstract void saturday();

    public Timetable buildTimetable(){
        sunday();
        monday();
        tuesday();
        wednesday();
        thursday();
        friday();
        saturday();
        return timetable;
    }

}

使用时:

public class TestBuilder {

    @Test
    public void test(){
        System.out.println(new ComputerScienceTimetableBuilder().buildTimetable().toString());
        System.out.println();
        System.out.println(new SoftwareEngineeringTimetableBuilder().buildTimetable().toString());
    }

}

在我们并不关注构建过程是否统一,构建类能否统一管理时,抽象类都可以省略,每个类型有自己的构建方法,这也是很多复杂对象的创建方式,详见:Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器

这个插件可以自动生成JavaBean的Builder模式代码,可以采用链式调用的方法完成对象的构建,并且可以在build()方法中检查依赖,代码较少,容易理解。

总结

Builder模式的好处显而易见:对象的声明和初始化分离,开发人员不必知道创建的具体过程,但可以通过相同的创建过程来创建不同的对象,对于那些创建复杂的对象是非常有帮助的。

Director或模板方法模式,可以让创建过程条理清晰,代码可读性更高,这只是针对相似类型的创建,假设类型之间的差别太大,那就不建议使用构建者模式。当类型较多时,可能产生大量的构建者,系统变得特别复杂。

因此在业务场景几乎不变并且类型构建过程非常相似的场景下,可以使用构建者模式,在其他情况下,如果也想体验构建者模式带来的便利,可以使用轻量级的构建者模式,即:Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器

猜你喜欢

转载自blog.csdn.net/CL_YD/article/details/87926362