23种设计模式:22建造者Bulider模式(生成器模式)

it2023-07-12  65

场景介绍

建造者模式经常用在创建“细节”比较繁琐的类,比如,富士康需要装配苹果手机,他的步骤可能是,安装CPU、安装主板、安装内存条、安装摄像头、安装屏幕…………,此时,富士康又接到小米手机的订单,他的安装步骤与苹果的安装步骤一样,我们为了保证安装不出问题,比如忘记安装摄像头了,我们就可以尝试使用建造者模式,下面我们先看看UML图。

UML图

代码

Foxconn:这里模拟的富士康,不管你来的是小米手机的安装还是苹果实际的安装,只要你是PhoneBuilder的子类,我都可以安装,所以此时的Foxconn,就是建造者里面的指挥者,只和PhoneBuilder这个父类相关。 public class Foxconn { public Phone construct(PhoneBuilder phoneBuilder){ phoneBuilder.installCPU(); phoneBuilder.installMainBoard(); phoneBuilder.installMemory(); phoneBuilder.installCamera(); phoneBuilder.installScreen(); return phoneBuilder.getPhone(); } } PhoneBuilder:相关于定义了手机通用的安装过程,而具体的每款手机的安装细节,在子类中实现。比如:MIBuilder和AppleBuilder。 package design.builder; abstract class PhoneBuilder { public abstract void installCPU(); public abstract void installMainBoard(); public abstract void installMemory(); public abstract void installCamera(); public abstract void installScreen(); public abstract Phone getPhone(); } class MIBuilder extends PhoneBuilder{ private Phone phone = new Phone(); @Override public void installCPU() { phone.setCPU("骁龙865"); } @Override public void installMainBoard() { phone.setMainBoard("双层 L’型的异形主板"); } @Override public void installMemory() { phone.setMemory("16GB"); } @Override public void installCamera() { phone.setCamera("4800万 像素超清主摄"); } @Override public void installScreen() { phone.setScreen("6.67″ AMOLED"); } @Override public Phone getPhone() { return phone; } } class AppleBuilder extends PhoneBuilder{ private Phone phone = new Phone(); @Override public void installCPU() { phone.setCPU("A14"); } @Override public void installMainBoard() { phone.setMainBoard("双层 L’型的异形主板"); } @Override public void installMemory() { phone.setMemory("16GB"); } @Override public void installCamera() { phone.setCamera("双摄系统:1200 万像素超广角及广角"); } @Override public void installScreen() { phone.setScreen("6.1″ AMOLED"); } @Override public Phone getPhone() { return phone; } } Phone:这个就是很正常的javaBean类了,没有什么特殊之处,下面省略了get方法 package design.builder; public class Phone { private String CPU; private String mainBoard; private String memory; private String camera; private String screen; public void setCPU(String CPU) { this.CPU = CPU; } public void setMainBoard(String mainBoard) { this.mainBoard = mainBoard; } public void setMemory(String memory) { this.memory = memory; } public void setCamera(String camera) { this.camera = camera; } public void setScreen(String screen) { this.screen = screen; } @Override public String toString() { return "Phone{" + "CPU='" + CPU + '\'' + ", mainBoard='" + mainBoard + '\'' + ", memory='" + memory + '\'' + ", camera='" + camera + '\'' + ", screen='" + screen + '\'' + '}'; } } 调用方式 public static void main(String[] args) { Foxconn foxconn = new Foxconn(); Phone mi = foxconn.construct(new MIBuilder()); System.out.println(mi); Phone apple = foxconn.construct(new AppleBuilder()); System.out.println(apple); }

总结

Foxconn(Director):和Builder的关系,符合依赖倒转,Foxconn面向的是接口编程,而不是MIBuilder等细节。建造者模式,可以有效的将复杂的Phone的创建过程,变成稳定的建造过程,如果建造过程有误,编译器会有效的提醒我们。
最新回复(0)