设计模式——建造者模式
介绍
建造者模式使多个简单的对象构建成一个复杂对象。属于创建对象的一种方式。
意图
将一个复杂的构建与其表现分离。
解决
一个复杂的对象通常由多个部分的子对象构成;
但是子对象常常回发生改变,但是组合方式比较稳定。
优点
-
创造者独立,易扩展;
-
便于控制细节风险。
缺点
- 产品必须有共同特点;
- 若内部变化复杂则会由很多的建造类。
使用场景
- 需要生成的对象具有复杂的内部解构;
- 需要生成的对象内部属性相互依赖
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());
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效