• 建造者模式Builder


    简介

      建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation)。

    角色

    • 产品(Product):产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
    • 抽象建造者(Builder):一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildHead buildBody和buildFoot),另一种是返还产品方法(retrieveProduct)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少零件就有多少相应的建造方法(所有组件)。
    • 具体建造者(ConcreteBuilder):担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。
    • 导演者(Director):担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体操作,真正拥有产品类的具体操作的是具体建造者角色。

      导演者角色是与客户端打交道的角色。导演者将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。
      一般来说,每有一个产品类,就有一个相应的具体建造者类。这些产品应当有一样数目的零件,而每有一个零件就相应地在所有的建造者角色里有一个建造方法。
      建造模式利用一个导演者对象和具体建造者对象一个个地建造出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件的建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。

    类图

    源码

    产品

    public class Product {
        private String head;
        private String body;
        private String foot;
    
        public String getHead() {
            return head;
        }
    
        public void setHead(String head) {
            this.head = head;
        }
    
        public String getBody() {
            return body;
        }
    
        public void setBody(String body) {
            this.body = body;
        }
    
        public String getFoot() {
            return foot;
        }
    
        public void setFoot(String foot) {
            this.foot = foot;
        }
    }

    抽象建造者

    public interface Builder {
        public void buildHead();
    
        public void buildBody();
    
        public void buildFoot();
    
        public Product retrieveProduct();
    }

    具体建造者

    public class ConcreteBuilder implements Builder {
        private Product product = new Product();
    
    
        public void buildHead() {
            product.setHead("头组装好了");
        }
    
        public void buildBody() {
            product.setBody("身体组装好了");
        }
    
        public void buildFoot() {
            product.setFoot("脚组装好了");
        }
    
        public Product retrieveProduct() {
            return product;
        }
    }

    导演

    public class Director {
        private Builder builder;
    
        public Director(Builder builder) {
            this.builder = builder;
        }
    
        public void buildProduct() {
            builder.buildHead();
            builder.buildBody();
            builder.buildFoot();
        }
    }

    客户端&结果

        public static void main(String[] args) throws Exception {
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);
            director.buildProduct();
    
            Product product = builder.retrieveProduct();
            System.out.println(product.getHead());
    //      结果:头组装好了
        }

    不同

    建造者模式与抽象工厂模式的比较:

    • 与抽象工厂模式相比, 建造者模式返回一个组装好的完整产品 ,而 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
    • 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
    • 如果将抽象工厂模式看成 汽车配件生产工厂 ,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂 ,通过对部件的组装可以返回一辆完整的汽车。
  • 相关阅读:
    第八周总结
    第五周学习总结&实验报告(三)
    第四周课程总结&试验报告(二)
    第三周课程总结&实验报告(一)
    第二周Java学习总结
    2019春学习总结
    第二周基础学习
    第三周编程总结
    2019春第四次课程设计实验报告
    2019春第三次课程设计实验报告
  • 原文地址:https://www.cnblogs.com/manusas/p/7526808.html
Copyright © 2020-2023  润新知