• 建造者模式


    定义

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    4个角色:

    • Product产品类:通常是实现了模板方法模式,也就是有模板方法和基本方法
    • Builder抽象建造者:规范产品的组件,一般是由子类实现。
    • ConcreteBuilder具体建造者:实现抽象类定义的所有方法,并且返回一个组件好的对象。
    • Director导演类:负责安排已有模块的顺序,然后告诉Builder开始建造

    优点

    • 封装性:使用建造者模式可以使客户端不必知道产品内部组成的细节
    • 建造者独立,容易扩展
    • 便于控制细节风险

    使用场景

    • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式
    • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式
    • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能
    • 在创建对象过程中会使用到系统中的其他一些对象,这些对象在产品对象创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。

    注意事项建造者模式光关注的时零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同地方。

    代码实现

    建造者模式

    package com.lidaxia.design.pattern.creational.builder;
    
    /**
     * @author lidaxia
     * @version 1.0
     * @date 2022/11/29 21:04
     */
    public class Product {
    
        public void doSomething() {
            /**
             * 独立业务处理
             */
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    package com.lidaxia.design.pattern.creational.builder;
    
    /**
     * @author lidaxia
     * @version 1.0
     * @date 2022/11/29 21:05
     */
    public abstract class Builder {
    
        /**
         * 设置产品的不同部分,以获得不同的产品
         */
        public abstract void setPart();
    
        /**
         * 建造产品
         *
         * @return
         */
        public abstract Product buildProduct();
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    package com.lidaxia.design.pattern.creational.builder;
    
    /**
     * @author lidaxia
     * @version 1.0
     * @date 2022/11/29 21:07
     */
    public class ConcreteProduct extends Builder{
    
        private Product product = new Product();
    
        @Override
        public void setPart() {
            /**
             * 产品类内的逻辑处理
             */
        }
    
        @Override
        public Product buildProduct() {
            /**
             * 组件一个产品
             */
            return product;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    package com.lidaxia.design.pattern.creational.builder;
    
    /**
     * @author lidaxia
     * @version 1.0
     * @date 2022/11/29 21:09
     */
    public class Director {
    
        private Builder builder = new ConcreteProduct();
    
        /**
         * 构建不同的产品
         *
         * @return
         */
        public Product getProduct() {
            builder.setPart();
            /**
             * 设置不同的零件,产生不同的产品
             */
            return builder.buildProduct();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    Spring开发:动态代理的艺术与实践
    快速部署 MySQL InnoDB Cluster
    华为机试真题 Python 实现【积木最远距离】【2022.11 Q4 新题】
    django-haystack使用小结
    Mybatis04(关联关系映射)
    LongAdder原理浅析
    Vue 通过 Hash、Histroy 实现一个SPA、VueRouter 的简单实现(分享)
    字节测试工程师十年经验直击UI 自动化测试痛点
    (十一)PostgreSQL的wal日志(2)-默认wal日志大小
    软考高级软件架构师论文——论软件架构评估
  • 原文地址:https://blog.csdn.net/qq_39630624/article/details/128106653