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());
    }
    }
  • 相关阅读:
    面试题
    网络编程-1
    excel文件导入数据库--jxl包
    excel文件导入数据库
    1113 Integer Set Partition (25 分)集合分割
    1120 Friend Numbers (20 分)set的使用
    1099 Build A Binary Search Tree (30 分)
    1092 To Buy or Not to Buy (字符串删除)
    1127 ZigZagging on a Tree (30 分)树的层次遍历
    1155 Heap Paths (30 分)判断是否是一个堆
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10841556.html
Copyright © 2011-2022 走看看