• Builder 建造者模式 [MD]


    博文地址

    我的GitHub 我的博客 我的微信 我的邮箱
    baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

    目录

    建造者模式

    简介

    建造者模式的概念:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示。

    大概的意思,就是一套的构建过程可以有不同的产品(表示)出来。这些产品(表示)都按照这一套的构建过程被生产出来。

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

    • Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类去实现。
    • ConcreteBuilder:实现 Builder 接口,针对不同的业务逻辑,具体化各类型对象各个组成部分的建造,最后返回一个建造好的产品。
    • Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
    • Product:要构造的复杂对象。

    定义了一个新的类来构建另一个类的实例,以简化复杂对象的创建。建造模式通常也使用方法链接来实现。

    java.lang.StringBuilder#append()
    

    作用:

    • 构造逻辑提到单独的类中
    • 分离类的构造逻辑和表现

    案例

    一个被构造的复杂对象。

    public class Productor {
        public String head;
        public String body;
        public String foot;
        //...
    }
    

    抽象的 Builder,为创建一个 Product 对象的各个部件指定抽象接口。

    public interface IBuilder {
        void buildHead();
        void buildBody();
        void buildFoot();
        Productor buildPerson();
    }
    

    具体的建造者

    对于客户端而言,只需要关心具体的建造者,无需关心产品内部构建流程

    如果客户端需要其他的复杂产品对象,只需要选择其他的建造者即可;也即,如果后续需要扩展,则只需要添加一个新的 Builder 就行。

    //具体的建造者。实现Builder接口以构造和装配该产品的各个部件。
    public class ConcreteBuilder implements IBuilder {
        Productor person;
    
        public ConcreteBuilder() {
            person = new Productor();
        }
        // 在此创建出部件
        public void buildBody() {
            person.body = "身体"; //在这里根据客户端的需要建造男人的身体
        }
        public void buildFoot() {
            person.foot = "脚"; //在这里根据客户端的需要建造男人的脚
        }
        public void buildHead() {
            person.head = "头"; //在这里根据客户端的需要建造男人的头
        }
        // 返回复杂产品对象
        public Productor buildPerson() {
            return person;
        }
    }
    

    导演,负责流程规范,在导演类中可以注入建造者对象。

    public class Director {
        private IBuilder builder;
    
        public Director(IBuilder builder) {
            this.builder = builder; // 构造方法中传递builder
        }
        // 这个方法用来规范流程,产品构建和组装方法
        public Productor construct() {
            builder.buildHead();
            builder.buildBody();
            builder.buildFoot();
            return builder.buildPerson();
        }
    }
    

    客户端使用

    public class Test {
        public static void main(String[] args) {
            IBuilder builder = new ConcreteBuilder(); //具体的建造者
            Director director = new Director(builder); //把建造者注入导演
            Productor person = director.construct(); //导演负责流程把控
            System.out.println(person.body);
        }
    }
    

    2016-10-31

  • 相关阅读:
    leetcode算法题基础(三十三)动态规划(一)70. 爬楼梯
    leetcode算法题基础(三十二)trie(四)676. 实现一个魔法字典
    leetcode算法题基础(三十一)trie(三)692. 前K个高频单词
    leetcode算法题基础(三十)trie(二)720. 词典中最长的单词
    leetcode算法题基础(二十九)trie(一)211. 添加与搜索单词
    leetcode算法题基础(二十八)拓扑排序(二)210. 课程表 II
    leetcode算法题基础(二十七)拓扑排序(一)207. 课程表
    leetcode算法题基础(二十六)深度优先(四)721. 账户合并
    leetcode算法题基础(二十五)深度优先(三)200. 岛屿数量
    leetcode算法题基础(二十四)深度优先(二)101. 对称二叉树
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/6016445.html
Copyright © 2020-2023  润新知