创建型之【建造者模式】
一、使用场景
建造者(Builder)模式创建的复杂对象,其产品的各个部分经常面临着剧烈的变化,但将他们组合在一起的算法却相对稳定,所以他们通常在以下场合使用。
1、创建的对象比较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
2、创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。
二、案例
以创建共享单车为例,生产自行车是一个复杂的过程,它包含了车架、车座等组件的生产。而车座又有炭纤维、铝合金等材质的,车座有橡胶、真皮等材质。对于自行车的生产就可以使用建造者模式。
/** * @Description:产品对象 * @Author: Xiaohemaio * @Date: 20/3/2022 下午12:37 */ public class Bike { private String frame;// 车架 private String seat;// 车座 public String getFrame() { return frame; } public void setFrame(String frame) { this.frame = frame; } public String getSeat() { return seat; } public void setSeat(String seat) { this.seat = seat; } }
/** * @Description: * @Author: Xiaohemaio * @Date: 20/3/2022 下午12:39 */ public abstract class Builder { // 声明Bike类型的变量,并进行赋值 protected Bike bike=new Bike(); public abstract void BuildFrame(); public abstract void BuildSeat(); // 构建自行车的方法 public abstract Bike CreateBike(); }
/** * @Description:摩拜单车 * @Author: Xiaohemaio * @Date: 20/3/2022 下午12:44 */ public class MobileBuilder extends Builder { @Override public void BuildFrame() { bike.setFrame("炭纤维车架"); } @Override public void BuildSeat() { bike.setSeat("真皮车座"); } @Override public Bike CreateBike() { return bike; } }
/** * @Description:OfO共享单车 * @Author: Xiaohemaio * @Date: 20/3/2022 下午2:41 */ public class OfoBuilder extends Builder{ @Override public void BuildFrame() { bike.setFrame("ofo车架"); } @Override public void BuildSeat() { bike.setSeat("ofo车座"); } @Override public Bike CreateBike() { return bike; } }
/** * @Description:指挥者类 * @Author: Xiaohemaio * @Date: 20/3/2022 下午2:44 */ public class Director { private Builder builder; // 声明builder类型的变量 public Director(Builder builder) { this.builder=builder; } // 组装自行车的功能 public Bike Construct() { builder.BuildFrame(); builder.BuildSeat(); return builder.CreateBike(); } }
/** * @Description:测试案例 * @Author: Xiaohemaio * @Date: 20/3/2022 下午2:48 */ public class BuilderDemo { public static void main(String[] args) { // 创建指挥者对象 Director director = new Director(new MobileBuilder()); // 让指挥者指挥组装自行车 Bike bike = director.Construct(); System.out.println(bike.getFrame()); System.out.println(bike.getSeat()); } }
三、模式扩展
建造者模式除了上面的用途外,在开发中还有一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会很差,而且很容易引入错误,此时就可以利用建造者模式进行重构。
/** * @Description:手机类 * @Author: Xiaohemaio * @Date: 20/3/2022 下午4:12 */ public class Phone { private String Cpu; private String Screen; private String Memory; // 构造函数私有 private Phone(Builder builder) { this.Cpu = builder.Cpu; this.Screen = builder.Screen; this.Memory = builder.Memory; } public static final class Builder { private String Cpu; private String Screen; private String Memory; public Builder Cpu(String cpu) { this.Cpu = cpu; return this; } public Builder Screen(String screen) { this.Screen = screen; return this; } public Builder Memory(String memory) { this.Memory = memory; return this; } // 使用构建者创建phone对象 通过构建者对象获取手机对象 public Phone Build() { return new Phone(this); } } @Override public String toString() { return "Phone{" + "Cpu='" + Cpu + '\'' + ", Screen='" + Screen + '\'' + ", Memory='" + Memory + '\'' + '}'; } }
** * @Description:手机测试类 * @Author: Xiaohemaio * @Date: 20/3/2022 下午4:34 */ public class BuilderPhoneDemo { public static void main(String[] args) { Phone phone = new Phone.Builder() .Cpu("I7英特尔") .Screen("戴尔屏幕") .Memory("SSD") .Build(); System.out.println(phone); } }