zoukankan      html  css  js  c++  java
  • 建造者模式

    什么是建造者模式

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

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。

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

    1、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

    2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。

    3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

    4、Product:要创建的复杂对象。

    建造者应用场景

    1、JAVA 中的 StringBuilder 数组(单个字符)字整合在一起 字符串

     

    使用场景:

    1、需要生成的对象具有复杂的内部结构。

    2、需要生成的对象内部属性本身相互依赖。

    建造者与工厂模式的区别:建造者模式更加关注与零件装配的顺序。

    案例:

    这里以游戏开发中人物的构造过程为例。在游戏中创建一个形象时,需要对每个部位进行创建。简化而言,需要创建头部,身体和四肢等。

    建立一个人物对象Person

    package com.example.demo.builderfactory;

    import lombok.Data;

    /**
    * 组装者 实体
    * 这里以游戏开发中人物的构造过程为例。在游戏中创建一个形象时,需要对每个部位进行创建。简化而言,需要创建头部,身体和四肢。
    * 头部、体部、底部
    */
    @Data
    public class Person {
    /**
    * 头部
    */
    private String head;

    /**
    * 体部
    */
    private String body;

    /**
    * 脚部
    */
    private String foot;

    }

    package com.example.demo.builderfactory;

    /**
    * 构造者 Builder 接口
    * 给出一个抽象接口,以规范产品对象的各个组成成分的建造。
    * 这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建
    */
    public interface PersonBuilder {
    /**
    * 构建头部
    */
    void builderHead();

    /**
    * 构建体部
    */
    void builderBody();

    /**
    * 构建脚部
    */
    void builderFoot();

    /**
    * 组装组件
    * @return
    */
    Person builderPerson();
    }

    package com.example.demo.builderfactory;

    /**
    * 构建人物 中国人 组件
    * 实现 PersonBuilder 接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例
    */
    public class ChineseBuilder implements PersonBuilder {

    private Person person;

    @Override
    public void builderHead() {
    person.setHead("中国人 头部:黑头发、黑眼睛");
    }

    @Override
    public void builderBody() {

    person.setBody("中国人 体部:黄皮肤、个子中等");
    }

    @Override
    public void builderFoot() {

    person.setFoot("中国人 底部:腿细、苗条");

    }

    @Override
    public Person builderPerson() {
    return person;
    }
    }

    package com.example.demo.builderfactory;

    /**
    * 构建人物 美国人(组件)
    * 实现 PersonBuilder 接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例
    */
    public class AmericanBuilder implements PersonBuilder {

    private Person person;


    public AmericanBuilder() {
    person = new Person();
    }

    @Override
    public void builderHead() {
    person.setHead("美国人 头部:黄头发、蓝眼睛、长脸");
    }

    @Override
    public void builderBody() {
    person.setBody("美国人 体部:个人高、块头大");
    }

    @Override
    public void builderFoot() {

    person.setFoot("美国人 底部:腿长、脚大");

    }

    @Override
    public Person builderPerson() {
    return person;
    }
    }

    package com.example.demo.builderfactory;

    /**
    * 构建任务 整合所有组件
    * 调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建
    */
    public class PersonDirector {

    public Person createPerson(PersonBuilder personBuilder){
    personBuilder.builderHead();
    personBuilder.builderBody();
    personBuilder.builderFoot();
    return personBuilder.builderPerson();
    }

    /**
    * 运行时初始化对象 所以需要创建构造函数 否则会报空指针异常
    * @param args
    */
    public static void main(String[] args) {
    PersonDirector personDirector = new PersonDirector();
    Person person = personDirector.createPerson(new AmericanBuilder());
    System.out.println(person.getHead()+", "+person.getBody()+", "+person.getFoot());
    }
    }
  • 相关阅读:
    chrome浏览器中安装以及使用Elasticsearch head 插件
    windows10 升级并安装配置 jmeter5.3
    linux下部署Elasticsearch6.8.1版本的集群
    【Rollo的Python之路】Python 爬虫系统学习 (八) logging模块的使用
    【Rollo的Python之路】Python 爬虫系统学习 (七) Scrapy初识
    【Rollo的Python之路】Python 爬虫系统学习 (六) Selenium 模拟登录
    【Rollo的Python之路】Python 爬虫系统学习 (五) Selenium
    【Rollo的Python之路】Python 爬虫系统学习 (四) XPath学习
    【Rollo的Python之路】Python 爬虫系统学习 (三)
    【Rollo的Python之路】Python sys argv[] 函数用法笔记
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10841556.html
Copyright © 2011-2022 走看看