设计模式-建造者模式

前言

我们可以通过new创建一个对象,并且可以通过定义不同参数的构造方法,实现创建出不同的对象的效果,但是这种做法的后果就是,随着业务复杂,构造方法会越来越多,参数的个数也会越来越多,导致最后维护困难,理解难度加大,利用建造者模式就可以解决这个问题。

定义

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

将一个复杂对象拆分成多个简单对象,然后通过组合拼成一个完整对象表示,简单对象可以灵活选择,最终导致相同的构建过程,创建出的表示会根据意愿表示出各种不同结果

优点

  • 封装性好,构建和表示分离
  • 解耦
  • 建造者对创建过程细化,客户端不必知道产品内部组成细节

缺点

  • 产品的组成部分必须相同
  • 如果产品内部发生变化,建造者也要同步修改,维护成本大

笼统的来看,好像工厂模式也是将对象的创建抽离出去,但是建造者(Builder)模式工厂模式的关注点确有着极大的不同:建造者模式注重零部件的组装过程,而工厂模式更注重零部件的创建过程,但两者可以结合使用。

图解

image.png

实现

复杂产品对象Iphone 包含多个组成部件的复杂对象

@Data
public class Iphone {
    private Battery battery;//电池
    private Screen screen; //显示屏
    /*显示产品特性*/
    public void show() {
        battery.print();
        screen.print();
        System.out.println("iphone组装完成");
    }
}

组成部件A:具体产品:Battery

public class Battery {
    public void print() {
        System.out.println("电池生产完成");
    }
}

组成部件B:具体产品:Screen

public class Screen {
    public void print() {
        System.out.println("显示屏生产完成");
    }
}

抽象建造者Builder 包含多个部件的抽象创建方法,通常还有一个返回复杂对象的具体方法

abstract class Builder {
    //创建产品对象
    protected Iphone iphone = new Iphone();
    public abstract void buildBattery();
    public abstract void buildScreen();
    //返回产品
    public Iphone getResult(){
        return iphone;
    }
}

具体建造者BuilderImpl完成复杂部件的各个组成部件的具体创建方法

//具体建造者:实现了抽象建造者接口。
public class BuilderImpl extends Builder {
    @Override
    public void buildBattery() {
        iphone.setBattery(new Battery());
    }

    @Override
    public void buildScreen() {
        iphone.setScreen(new Screen());
    }
}

指挥者Director 规定具体的生产组装方式

public class Director {
    private final Builder builder;
    public Director(Builder builder){
        this.builder = builder;
    }
    //产品组装方法
    public Iphone construct(){
        builder.buildBattery();
        builder.buildScreen();
        return builder.getResult();
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        Builder builder = new BuilderImpl();
        Director director = new Director(builder);
        Iphone iphone = director.construct();
        iphone.show();
    }
}

打印输出

电池生产完成
显示屏生产完成
iphone组装完成

说明

  • 当需要生产一个Iphone时,客户端(Client)直接和指挥者(Director)进行需求沟通;
  • 通后Director将生产Iphone的需求分发给各个部件的建造者(Builder);
  • 各个部件的建造请求委派到具体的建造者(BuilderImpl);
  • 各个具体建造者负责进行产品部件的构建;
  • 最终构构建成一个完整的Iphone

构建具体部件的时候可以结合工厂模式,生产出不同厂家的部件,最后得到不同配置的Iphone,这里感兴趣的朋友可以自己去实现一下。

总结

  • 工作中,如果我们需要将一个复杂对象的构建与它的表示分离或者遇到多个构造器参数时要学会使用建造者模式。
  • 建造者模式更加注重的是对象创建的顺序,一个复杂对象通过不同的组装顺序,最终的表现也不一样,工厂模式注重的是对象的创建,创建出来的对象都一样。

如果这篇文章对您有帮助,非常欢迎您点赞支持!这不仅是对我工作的认可,也能鼓励我继续创作更多有价值的内容。感谢您的支持和反馈,希望未来还能为您提供更多有益的信息和灵感。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹申阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值