JAVA 建造者模式

文章目录

介绍

建造者模式(实现)

介绍

描述

建造者模式设计模式属于创建型模式,通过多个简单的对象去简化一个复杂对象的构建。通过构建和装配的解耦,不同的构建器,也可以做出不同的对象,相同的构建器由于装配顺序的不同也可以做出不同的对象,也就是实现了构建算法、装配算法的分离,实现更好的复用。同时用户只需要指定复杂对象,而不用明确具体操作。

特点

优点:封装性好,创建和使用分离,无需修改源代码,一定程度上的解耦,方便代码的维护。

缺点:该类产品必须有相同点,使用范围有限,建造者模式创建出的对象其组成部分基本一致,若所构建对象之间差异较大,则不适合该模式。如果产品内部发生改变,整体都要进行改动,将设计到许多建造类修改。

实现原理

  1. 产品:提供构建对象。
  2. 建造者:抽象共同行为。
  3. 建造者实现:针对具体方案进行实现。
  4. 导演:管理者掌管建造出的实例的实际生产过程,返回最终的产品。

适用

  1. 用于描述具体复杂对象的创建。

  2. 需要生产的对象内部属性本身互相依赖。

建造者模式(实现)

第一步:定义Product(产品角色), 一个具体的产品对象。

/**
 * 产品对象
 */
public class Carrier {
    private String name;
    private String tyreCount;
    private String prince;

    // getter setter toString 省略...
}

第二步:定义Builder(抽象建造者),创建一个Product对象的各个部件指定的抽象接口。

public abstract class CarrierBuilder {


    Carrier carrier = new Carrier();

    // 构建操作
    public abstract String name();

    public abstract String tyreCount();

    public abstract String prince();

    // 产品 返回
    public Carrier buildCarrier() {
        return carrier;
    }
}

第三步:定义ConcreteBuilder(具体建造者),实现抽象接口,构建和装配各个部件。

public class CarBuilder extends CarrierBuilder{
    @Override
    public String name() {
        carrier.setName("汽车");
        return carrier.getName();
    }

    @Override
    public String tyreCount() {
        carrier.setTyreCount("轮胎-4");
        return carrier.getTyreCount();
    }

    @Override
    public String prince() {
       carrier.setPrince("价格-3600");
        return carrier.getPrince();
    }
}
public class CycleBuilder  extends CarrierBuilder{
    @Override
    public String name() {
       carrier.setName("自行车");
        return carrier.getName();
    }

    @Override
    public String tyreCount() {
       carrier.setTyreCount("轮胎-2");
        return carrier.getTyreCount();
    }

    @Override
    public String prince() {
        carrier.setPrince("价格-1800");
        return carrier.getPrince();
    }
}

第四步:定义Director(指挥者), 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。隔离了客户与对象的生产过程,负责控制产品对象的生产过程。

/**
 * 指挥者 构建一个使用builder接口的对象
 */
public class CarrierDirector {

    private CarrierBuilder carrierBuilder;

    // 通过setter 传入carrierBuilder
    public CarrierDirector(CarrierBuilder carrierBuilder) {
        this.carrierBuilder = carrierBuilder;
    }

    // 具体的实现流程 交给指挥者
    public Carrier constructCarrier() {
        // 指定产品名称
        carrierBuilder.name();
        // 指定轮胎
        carrierBuilder.tyreCount();
        // 指定价格
        carrierBuilder.prince();
        // 准备完毕 返回给客户完整
        return carrierBuilder.buildCarrier();
    }
}

第五步:定义测试类。

public class Test {
    public static void main(String[] args) {
        CarBuilder carBuilder = new CarBuilder();
        CarrierDirector directorCar = new CarrierDirector(carBuilder);
        Carrier car = directorCar.constructCarrier();
        System.out.println(car);
        CycleBuilder cycleBuilder = new CycleBuilder();
        CarrierDirector directorCycle = new CarrierDirector(cycleBuilder);
        Carrier cycle = directorCycle.constructCarrier();
        System.out.println(cycle);
    }
}

测试结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值