设计模式 —— 建造者模式

别等时光非礼了梦想. 提交于 2020-01-12 13:48:27

一.什么是构建者模式:
将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了
复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具
有复合属性的对象。

二.适用场景:
1、隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
2、多个部件都可以装配到一个对象中,但产生的运行结果不相同
3、产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
4、初始化一个对象时,参数过多,或者很多参数具有默认值
5、不适合创建差异性很大的产品类产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,
增加项目中类的数量,增加系统的理解难度和运行成本
6、需要生成的产品对象有复杂的内部结构,这些产品对象具备共性

三.主要作用:
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
用户只需要给出指定复杂对象的类型和内容;
建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)

四.解决的问题:
方便用户创建复杂的对象(不需要知道实现过程)
代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)

五.优缺点:
优点:
使用建造者模式可以使客户端不必知道产品内部组成的细节。
具体的建造者类之间是相互独立的,这有利于系统的扩展。
具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。

缺点:
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,
则不适合使用建造者模式,因此其使用范围受到一定的限制。如果产品的内部变化复杂,可能会
导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

六.建造者模式与抽象工厂模式的比较:
1、与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关
的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
2、在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模
式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括
对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
3、如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个
汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车

七.例子:

//非建造者模式的产品类:public class Computer { 

    private String cpu; 
    private String screen; 
    private String memory; 
    private String mainboard; 

    public Computer(String cpu, String screen, String memory, String mainboard) { 
        this.cpu = cpu; 
        this.screen = screen; 
        this.memory = memory; 
        this.mainboard = mainboard; 
    } 
}
//建造者模式的产品类:public class NewComputer { 

    private String cpu; 
    private String screen; 
    private String memory; 
    private String mainboard; 

    public NewComputer() { 
        throw new RuntimeException(“can’t init”); 
    } 

    private NewComputer(Builder builder) { 
        cpu = builder.cpu; 
        screen = builder.screen; 
        memory = builder.memory; 
        mainboard = builder.mainboard; 
    } 

    public static final class Builder { 

        private String cpu; 
        private String screen; 
        private String memory; 
        private String mainboard; 

        public Builder() {} 

        public Builder cpu(String val) { 
            cpu = val; 
            return this; 
        } 

        public Builder screen(String val) { 
            screen = val; 
            return this; 
        } 

        public Builder memory(String val) { 
            memory = val; 
            return this; 
        } 

        public Builder mainboard(String val) { 
            mainboard = val; 
            return this; 
        } 

        public NewComputer build() {
            return new NewComputer(this);
        } 
    } 
}
//测试:public class Click { 

    public static void main(String[] args) { 
        // 非 Builder 模式 
        Computer computer = new Computer(“cpu”, “screen”, “memory”, “mainboard”); 
        // Builder 模式 
        NewComputer newComputer = new NewComputer.Builder() 
        .cpu(“cpu”) 
        .screen(“screen”) 
        .memory(“memory”) 
        .mainboard(“mainboard”) 
        .build(); 
    } 
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!