Java设计模式之建造者模式(Builder Pattern)

Posted 阿福聊编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式之建造者模式(Builder Pattern)相关的知识,希望对你有一定的参考价值。

前言

这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点。

一、建造者介绍

​ 用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象,这样就实现了的复用性和。

举例说明:

比如我们组建一个造飞船和装配飞船。

  1. 建造者:负责建造飞船(建造过程和细节)
  2. 装配者:只需要把各个零部件(引擎,轨道窗,发射塔)组装起来做成一个产品,用户只需要和装配者发生关系,获取到自己想要的产品即可。

image-20200514220858968

说明:

(1)、装配者(Director)直接和客户(Client)进行交流;交流后装配者将客户创建产品的需求划分为几个部分去请求(Builder)去做,

(2)、抽象的建造者(Builder)请求委派到具体的建造者(AirBuilder);各个具体建造者负责进行产品部件的构建;最终构建成具体产品(Product)。

其实很类似苹果的代工厂
苹果公司管产品的设计,设计出来的产品,交给中国大陆的代工厂去组装生产。

二、建造者的实例讲解

下面让我们来做一个具体的实例来讲解建造者模式:

飞船实例:

假设飞船(AirShip)由三个零部件组成(引擎,轨道窗,发射塔),那么这些零部件的创建就交给我们的建造者实现,抽象的建造者(AirShipBuilder)交给具体的建造者(ZgAirShipBuilder)来完成这些零部件的生产。

具体的装配者(ZgrAirShipDirector)只需要把建造者生产出来的零部件组装起来,客户端只需要与装配者打交道即可。

具体的实现代码如下:

飞船的组装零件(Engine,EscapeTower,OrbitaModule)


public class Engine {
    private String name;
    public Engine(String name){
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class EscapeTower {
    private String name;

    public EscapeTower(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class OrbitaModule {
    private String name;

    public OrbitaModule(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

飞船

/**
 * @author 13394
 */
public class AirShip {
    private EscapeTower escapeTower;
    private Engine engine;
    private OrbitaModule orbitaModule;

    public AirShip(EscapeTower escapeTower, Engine engine, OrbitaModule orbitaModule) {
        this.escapeTower = escapeTower;
        this.engine = engine;
        this.orbitaModule = orbitaModule;
    }

    public EscapeTower getEscapeTower() {
        return escapeTower;
    }

    public void setEscapeTower(EscapeTower escapeTower) {
        this.escapeTower = escapeTower;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public OrbitaModule getOrbitaModule() {
        return orbitaModule;
    }

    public void setOrbitaModule(OrbitaModule orbitaModule) {
        this.orbitaModule = orbitaModule;
    }
}

建造者 (AirShipBuilder,ZgAirShipBuilder)

public interface AirShipBuilder {
    Engine getEngine();
    EscapeTower getEscapeTower();
    OrbitaModule getOrbitaModule();
}

public class ZgAirShipBuilder implements AirShipBuilder {
    @Override
    public Engine getEngine() {
        System.out.println("构造发动机!!!!!!!!!!!!!");
        return new Engine("发动机");
    }

    @Override
    public EscapeTower getEscapeTower() {
        System.out.println("构造逃逸塔!!!!!!!!");
        return new EscapeTower("逃逸塔");
    }

    @Override
    public OrbitaModule getOrbitaModule() {
        System.out.println("构造轨道舱!!!!!!!!!!!!");
        return new OrbitaModule("轨道舱");
    }
}

装配者(AirShipDirector,ZgrAirShipDirector)

public interface AirShipDirector {
     public AirShip directAirShip();
}

public class ZgrAirShipDirector implements AirShipDirector {
    private AirShipBuilder airShipBuilder;

    public ZgrAirShipDirector(AirShipBuilder airShipBuilder) {
        this.airShipBuilder = airShipBuilder;
    }

    @Override
    public AirShip directAirShip() {
        Engine engine = airShipBuilder.getEngine();
        EscapeTower escapeTower = airShipBuilder.getEscapeTower();
        OrbitaModule orbitaModule = airShipBuilder.getOrbitaModule();
        AirShip airShip = new AirShip(escapeTower, engine, orbitaModule);

        return airShip;
    }
}

客户端(Client)调用

public class Client {
    public static void main(String[] args) {
        AirShipDirector airShipDirector=new ZgrAirShipDirector(new ZgAirShipBuilder());
        airShipDirector.directAirShip();
    }
}

通过以上这个飞船的例子我相信大家已经明白什么是建造者模式了吧!!!!!!!!!!

三、建造者模式的应用场景

开发中应用场景:
StringBuilder类的append方法
SQL中的 PreparedStatement
JDOM中DomBuilder、SAXBuilder

四、小结

那么建造者模式有什么优点和缺点呢?

优点:

  • 易于解耦
    将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
  • 易于精确控制对象的创建
    将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
  • 易于拓展
    增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。

缺点:

  • 如果产品足够复杂的话,那我们的建造者创建的越多,会造成庞大的类,不利于管理。

请帮忙点个赞,因为你的鼓励是我创作最大的动力!

以上是关于Java设计模式之建造者模式(Builder Pattern)的主要内容,如果未能解决你的问题,请参考以下文章

建造者(Builder)模式

Java设计模式之(建造者模式)

JAVA设计模式之建造者模式

java设计模式之 建造者(Builder)模式

Java学习笔记——设计模式之九.建造者模式

设计模式之建造者模式