设计模式——建造者模式

介绍

建造者模式使多个简单的对象构建成一个复杂对象。属于创建对象的一种方式。

意图

将一个复杂的构建与其表现分离。

解决

一个复杂的对象通常由多个部分的子对象构成;

但是子对象常常回发生改变,但是组合方式比较稳定。

优点

  1. 创造者独立,易扩展;

  2. 便于控制细节风险。

缺点

  1. 产品必须有共同特点;
  2. 若内部变化复杂则会由很多的建造类。

使用场景

  1. 需要生成的对象具有复杂的内部解构;
  2. 需要生成的对象内部属性相互依赖

UML

示例

Cellphone.java

package cn.geoaryblog.design.cretedg.builder;

public class Cellphone {
    private String cpu;
    private String screen;
    private String color;

    public String getCpu() {
        return cpu;
    }

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

    public String getScreen() {
        return screen;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

建造者类:PhoneBuilder.java

package cn.geoaryblog.design.cretedg.builder;

public abstract class PhoneBuilder {
    protected Cellphone cellphone = new Cellphone();
    public abstract void buildCpu();
    public abstract void buildScreen();
    public abstract void buildColor();
    public Cellphone getCellphone(){
        return cellphone;
    }
}

华为手机模型:HUAWEIPhone.java

package cn.geoaryblog.design.cretedg.builder;

public class HUAWEIPhone extends PhoneBuilder {
    @Override
    public void buildCpu() {
        cellphone.setCpu("海斯芯片");
    }

    @Override
    public void buildScreen() {
        cellphone.setScreen("JDI屏幕");
    }

    @Override
    public void buildColor() {
        cellphone.setColor("亮黑色");
    }
    
}

苹果手机模型:ApplePhone.java

package cn.geoaryblog.design.cretedg.builder;

public class ApplePhone extends PhoneBuilder {
    @Override
    public void buildCpu() {
        cellphone.setCpu("苹果研发");
    }

    @Override
    public void buildScreen() {
        cellphone.setScreen("无");
    }

    @Override
    public void buildColor() {
        cellphone.setColor("玫瑰金");
    }
}

指挥者:Director.java 隔离用户与建造过程

package cn.geoaryblog.design.cretedg.builder;

public class Director {
    private PhoneBuilder builder;
    public Director(PhoneBuilder builder){
        this.builder = builder;
    }
    public Cellphone createPhone(){
        builder.buildCpu();
        builder.buildScreen();
        builder.buildColor();
        return builder.getCellphone();
    }
}

客户端构建:BuildMain.java

package cn.geoaryblog.design.cretedg.builder;

public class BuildMain {
    public static void main(String[] args) {
        Cellphone hwphone = new Director(new HUAWEIPhone()).createPhone();
        System.out.println(hwphone.getCpu());
        System.out.println(hwphone.getScreen());
        System.out.println(hwphone.getColor());

        Cellphone applePhone = new Director(new ApplePhone()).createPhone();
        System.out.println(applePhone.getCpu());
        System.out.println(applePhone.getScreen());
        System.out.println(applePhone.getColor());
    }
}
posted @   Geoary  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示