• 建造者模式


    定义

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    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
  • 相关阅读:
    LVS部署-NAT集群实验
    SD_DATA_RECEIVE_SHIFT_REGISTER
    java .jks证书在php中的使用
    gopacket使用示例
    施耐德电气:勾勒未来工业愿景,赋能中国市场
    前缀和+差分+ 树状数组
    FPGA解析B码----连载1
    有关于 this 的基础练习题
    <五>关于类的各类成员
    LeetCode220726_50、填充每个节点的下一个右侧节点指针
  • 原文地址:https://blog.csdn.net/qq_39630624/article/details/128106653