设计模式之建造者模式

概述

建造者设计模式(Builder Pattern)属于创建型设计模式,主要用于创建复杂的对象,可将复杂对象的构建过程抽象出来,通过不同实现的构建者和装配者最终组装出不同的对象,可以非常方便的增加不同实现的构建者、组装者而不用修改以前的代码。

本质

建造者设计模式(Builder Pattern)分离了对象子组件的构造过程和组装过程,实现了构造和组装的解耦,不同的构造器相同的组装顺序,以及相同的构造器不同的组装顺序都可以创建出不同的对象,使得构建与组装充分解耦,进而实现构建算法与组装算法的解耦,从而实现更好的复用。

关键概念

构建者(Builder):构建不同的子组件且返回子组件或者提供获取复杂对象的方法,将构建过程抽象成接口或抽象类,方便扩展具体的不同的构建者。

组装者(Dirctor):通过某个具体的构建者构建相关的子组件,同时对外提供组成复杂产品对象的方法。

当需要生成复杂对象时,直接通过某个具体的组装者获得想要的具体对象即可,至于组装过程与构建过程使用者不需要关心,分别由具体的组装者和具体的构建者内部完成,当然复杂对象可以理解为具有很多属性的对象。

代码实现

以手机组装过程来说明构造者设计模式的具体实现

产品类 Phone

/**
 * 产品类
 */
public class Phone {

    private Screen screen;

    private Camera camera;

    private Cpu cpu;

    public Screen getScreen() {
        return screen;
    }

    public void setScreen(Screen screen) {
        this.screen = screen;
    }

    public Camera getCamera() {
        return camera;
    }

    public void setCamera(Camera camera) {
        this.camera = camera;
    }

    public Cpu getCpu() {
        return cpu;
    }

    public void setCpu(Cpu cpu) {
        this.cpu = cpu;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "screen=" + screen +
                ", camera=" + camera +
                ", cpu=" + cpu +
                '}';
    }
}

子组件,Screen类

/**
 * 子组件,屏幕
 */
public class Screen {

    private String name;

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Screen{" +
                "name='" + name + '\'' +
                '}';
    }
}

子组件,Camera类

/**
 * 子组件,摄像头
 */
public class Camera {

    private String name;

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Camera{" +
                "name='" + name + '\'' +
                '}';
    }
}

子组件,Cpu类

/**
 * 子组件,cpu芯片
 */
public class Cpu {

    private String name;

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Cpu{" +
                "name='" + name + '\'' +
                '}';
    }
}

抽象的构造者,PhoneBuilder接口

/**
 * 构建者
 */
public interface PhoneBuilder {

    Screen builderScreen();

    Camera builderCamera();

    Cpu builderCpu();
}

具体的构造者,MiPhoneBuilder 类

/**
 * 具体的构建者
 */
public class MiPhoneBuilder implements PhoneBuilder{

    @Override
    public Screen builderScreen() {
        System.out.println("构建小米的屏幕...");
        return new Screen("Mi-screen");
    }

    @Override
    public Camera builderCamera() {
        System.out.println("构建小米的相机...");
        return new Camera("Mi-camera");
    }

    @Override
    public Cpu builderCpu() {
        System.out.println("构建小米的cpu芯片...");
        return new Cpu("Mi-cpu");
    }
}

抽象的组装者,PhoneDirector 接口

/**
 * 抽象的组装者
 */
public interface PhoneDirector {

    Phone directPhone();
}

具体的组装者,MiPhoneDirector类

/**
 * 具体的组装者
 */
public class MiPhoneDirector implements PhoneDirector{

    private PhoneBuilder builder;

    public MiPhoneDirector(PhoneBuilder builder) {
        this.builder = builder;
    }

    @Override
    public Phone directPhone() {
        Phone phone = new Phone();
        phone.setScreen(builder.builderScreen());
        phone.setCamera(builder.builderCamera());
        phone.setCpu(builder.builderCpu());
        return phone;
    }
}

使用者直接通过某个具体的组装者获取最终的产品,具体如下

public class Client {

    public static void main(String[] args) {
        PhoneBuilder builder = new MiPhoneBuilder();
        MiPhoneDirector director = new MiPhoneDirector(builder);
        Phone phone = director.directPhone();
        System.out.println(phone);
    }
}

执行结果

构建小米的屏幕...
构建小米的相机...
构建小米的cpu芯片...
Phone{screen=Screen{name='Mi-screen'}, camera=Camera{name='Mi-camera'}, cpu=Cpu{name='Mi-cpu'}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值