码迷,mamicode.com
首页 > 其他好文 > 详细

创建者模式-建造者模式

时间:2020-06-26 16:34:40      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:pre   变化   bst   lang   tle   head   构造方法   info   protect   

建造者模式

一、概述

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

二、机构模式图

技术图片

  1. 建造者(Builder): 为创建一个产品对象的各个部件指定抽象接口
  2. 具体建造者(ConcreteBuider):实现Builder的接口,以构建和装配该产品的各个部分,定义并明确它所创建的表示,并提供一个检索产品的接口。
  3. 指挥者(Director):指挥并构造一个使用Builder 接口的的对象
  4. 产品(produce):表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配日过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

三、代码示例

  1. 要建造的具体产品

    /**
     * 具体产品类(这里以创建一个布娃娃为例)
     */
    public class RagdollProduct {
    
        // 头
        private String head; //可以是任意类型
    
        // 身体
        private String body;
    
        // 胳膊
        private String arm;
    
        // 腿
        private String leg;
    
        // get、set、toString 省略...
    }
    
  2. 抽象建造者与具体建造者【抽象建造者中定义了产品的创建方法和返回方法;具体建造者类中实现了抽象建造者类的抽象接口,构建和装配各个部件】

    /**
     * 定义产品的创建方法和返回方法
     */
    public abstract class Builder {
    
        protected RagdollProduct product = new RagdollProduct();
    
        public abstract void buildHead();
    
        public abstract void buildBody();
    
        public abstract void buildArm();
    
        public abstract void buildLeg();
    
        public RagdollProduct getResult()
        {
            return product;
        }
    }
    
    /**
     * 实现各个部分的装配方法
     */
    public class BuilderAdapter extends Builder {
    
        @Override
        public void buildHead() {
            product.setHead("布娃娃头");
            System.out.println("添加布娃娃的头...");
        }
    
        @Override
        public void buildBody() {
            product.setBody("布娃娃身体");
            System.out.println("添加布娃娃的身体...");
        }
    
        @Override
        public void buildArm() {
            product.setArm("布娃娃胳膊");
            System.out.println("添加布娃娃的胳膊...");
        }
    
        @Override
        public void buildLeg() {
            product.setLeg("布娃娃腿");
            System.out.println("添加布娃娃的退...");
        }
    }
    
  3. 指挥者类(Director),该类的主要作用有两个;一方面,它隔离了客户与生产过程;另一方面,它负责控制产品的生产过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。

    /**
     * 指挥者类
     */
    public class Director {
    
        private Builder builder;
    
        // 构造方法注入builder 对象
        public Director( Builder builder ){
            this.builder = builder;
        }
    
        // 定义指挥者创建一个布娃娃的过程
        public RagdollProduct construct(){
            builder.buildHead();
            builder.buildBody();
            builder.buildArm();
            builder.buildLeg();
            return builder.getResult();
        }
    }
    
  4. 测试

    public class Test {
        public static void main(String[] args) {
            Builder builder = new BuilderAdapter();
            Director director = new Director(builder);
            RagdollProduct construct = director.construct();
            System.out.println("一个完整的布娃娃:" + construct);
        }
    }
    

五、模式总结

  1. 优点:

    1. 用户只要指定建造者的类型就可以得到他们,而具体的建造过程和细节不需要知道。
    2. 建造代码与表示相分离,如果要改变一个产品的内部表示,只要再定义一个具体的建造者就可以了。
    3. 建造过程由指挥者来控制,建造细节由一个抽象类来控制,对于实现见制造细节的具体类来说,不会遗漏某一个步骤
  2. 缺点:

    加入现在需要增加创建产品的一个细节,

  3. 适用范围

    1. 当创建复杂对象的算法,应该独立于该对象的组成部分以及他们的装配方式时
    2. 当复杂对象的部件相对稳定,不会发生变化时

创建者模式-建造者模式

标签:pre   变化   bst   lang   tle   head   构造方法   info   protect   

原文地址:https://www.cnblogs.com/zhaoqiang-lab/p/13195048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!