Java设计模式_建造者模式

转自:http://www.runoob.com/design-pattern/builder-pattern.html

建造者(Builder Pattern)模式属于对象的创建模式,可以分布构建对象,将一个对象的属性与对象的创建周期分割开来,从而在创建过程中生成具有不同属性的对象。


介绍

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

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


三个角色:建造者具体的建造者监工使用者(严格来说不算)

  •  建造者角色:定义生成实例所需要的所有方法;
  •  具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
  •  监工角色:定义使用建造者角色中的方法来生成实例的方法;
  •  使用者:使用建造者模式。

建造者角色:

package com.wlz;

/**
 * @author zhiqiang zhang
 * @create 2019-02-15-12:49
 **/
public abstract class Builder {
    public abstract void buildPart1();
    public abstract void buildPart2();
    public abstract void buildPart3();
}

监工角色:

package com.wlz;

/** 监工角色
 * @author zhiqiang zhang
 * @create 2019-02-15-12:53
 **/
public class Director {
    //对象属性
    private Builder builder;
    //构造器
    public Director(Builder builder){
        this.builder=builder;
    }

    public Builder getBuilder() {
        return builder;
    }

    public void setBuilder(Builder builder) {
        this.builder = builder;
    }

    //定义一个构建过程
    public void construct(){
        builder.buildPart1();
        for(int i=0;i<5;i++){
            builder.buildPart2();
        }
        builder.buildPart3();
    }
}

具体建造者:

package com.wlz;

/** 具体的建造者角色
 * @author zhiqiang zhang
 * @create 2019-02-15-13:06
 **/
public class ConcreteBuilder1 extends Builder {

    @Override
    public void buildPart1() {
        System.out.println("构建模块一");
    }

    @Override
    public void buildPart2() {
        System.out.println("构建模块二");
    }

    @Override
    public void buildPart3() {
        System.out.println("构建模块三");
    }
}

测试:

 public static void TestBuilder(){
        //建造者
        ConcreteBuilder1 concreteBuilder1=new ConcreteBuilder1();
        //监工
        Director director=new Director(concreteBuilder1);
        //建造实例
        director.construct();
    }

运行结果:

构建模块一
构建模块二
构建模块二
构建模块二
构建模块二
构建模块二
构建模块三

扩展

建造者模式的简化:

  • 省略抽象建造者角色:如果系统中只需要一个具体建造者的话,可以省略掉抽象建造者。
  • 省略指挥者角色:在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略指挥者角色,让

Builder角色扮演指挥者与建造者双重角色。

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

  • 与抽象工厂模式相比, 建造者模式返回一个组装好的完整产品,而 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
  • 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
  • 如果将抽象工厂模式看成 汽车配件生产工厂 ,生产一个产品族的产品,那么建造者模式就是一个 汽车组装工厂 ,通过对部件的组装可以返回一辆完整的汽车。

猜你喜欢

转载自blog.csdn.net/zzq1824837536/article/details/87353298