• 设计模式【4】------>建造者模式


    一、什么是建造者模式

    • 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的方式进行创建。
    • 工厂类模式是提供的是创建单个类的产品
    • 而建造者模式则是将各种产品集中起来进行管理,用来具有不同的属性的产品

    建造者模式通常包括下面几个角色:

    • Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
    • ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
    • Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
    • Product:要创建的复杂对象。

    结构图:

    二、建造者模式的使用场景

    使用场景:

    1. 需要生成的对象具有复杂的内部结构。
    2. 需要生成的对象内部属性本身相互依赖。
    • 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
    • JAVA 中的 StringBuilder就是建造者模式创建的,他把一个单个字符的char数组组合起来
    • String不是建造者模式,它提供的操作应该是对于字符串本身的一些操作,而不是创建或改变一个字符串。

    代码案例
    1、电脑角色:包含多个组成部件的复杂对象。

    /**
     * 电脑角色:包含多个组成部件的复杂对象。
     */
    public class Computer {
        /**
         * 主机
         */
        private String host;
        /**
         * 显示器
         */
        private String monitor;
        /**
         * 键盘
         */
        private String keyboard;
    
        public void setHost(String host) {
            this.host = host;
        }
    
        public void setMonitor(String monitor) {
            this.monitor = monitor;
        }
    
        public void setKeyboard(String keyboard) {
            this.keyboard = keyboard;
        }
    
        public void show(){
            System.out.println("电脑组装成功...");
        }
    }

    2、抽象建造者:包含创建电脑各个子部件的抽象方法。

    /**
     * 抽象建造者:包含创建电脑各个子部件的抽象方法。
     */
    abstract class Builder {
    
        //创建产品对象
        protected Computer computer = new Computer();
    
        public abstract void buildHost();
    
        public abstract void buildMonitor();
    
        public abstract void buildKeyBoard();
    
        //返回产品对象
        public Computer getResult() {
    
            return computer;
        }
    
    }

    3、具体建造者:实现了抽象建造者接口。

    /**
     * 具体建造者:实现了抽象建造者接口。
     */
    public class ConcreteBuilder extends Builder {
        @Override
        public void buildHost() {
            System.out.println("建造主机...");
            computer.setHost("建造主机");
        }
    
        @Override
        public void buildMonitor() {
            System.out.println("建造显示器...");
            computer.setMonitor("建造显示器");
        }
    
        @Override
        public void buildKeyBoard() {
            System.out.println("建造键盘中...");
            computer.setKeyboard("建造键盘");
        }
    }

    4、指挥者:调用建造者中的方法完成复杂对象的创建。

    /**
     * 指挥者:调用建造者中的方法完成复杂对象的创建。
     */
    public class Director {
    
        private Builder builder;
    
        public Director(Builder builder){
            this.builder=builder;
        }
    
        //电脑构建与组装方法
        public Computer construct(){
            builder.buildHost();
            builder.buildMonitor();
            builder.buildKeyBoard();
            return builder.getResult();
        }
    }

    5、客户类。

    /**
     * 客户类
     */
    public class Client {
        public static void main(String[] args){
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);
            Computer construct = director.construct();
            construct.show();
        }
    }

    打印结果

     三、优缺点

    主要优点如下:

    1. 封装性好,构建和表示分离。
    2. 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
    3. 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。

    其缺点如下:

    1. 产品的组成部分必须相同,这限制了其使用范围。
    2. 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

    建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

    作者:donleo123
    本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
  • 相关阅读:
    今天英语有何新收获?
    今天了解了解了外包这一行业
    今天英语有何新收获?
    sicp 练习1.7
    今天英语有何新收获
    今天英语有何新收获?
    反射(初尝)
    初学正则表达式
    sicp 练习1.8 【有点疑惑】
    [tip]Windows filename MAX_PATH limitation
  • 原文地址:https://www.cnblogs.com/donleo123/p/14563279.html
Copyright © 2020-2023  润新知