设计模式系列-建造者模式
建造者模式用于将复杂对象的设计式创建和表示分离,有些对象由很多部分组成,模式每个部分又可以有多种不同选择,系列创建这种对象的建造时候往往需要考虑使用建造者模式。
举个例子
一辆汽车由发动机,设计式方向盘,模式车灯,系列车灯,建造车身颜色等组成,设计式每辆车的模式颜色,车轮大小,系列车灯样式可能会不一样,建造但是设计式车的组成部分不会少。
建造模式有两种实现方式,模式第一种方式是系列有导演的方式,第二种是无导演方式。根据我的经验日常使用无导演的云服务器方式可能会更多一些。
有导演
所谓有导演就是通过一个导演类来指挥对象创建的过程,客户端使用导演类来获取对象,不用关心对象具体的创建过程。
先看一下UML图,对建造模式有个大概的了解。
看一下具体代码,我们以建造一辆汽车举例
public class Car { private String wheel; private String engine; private String seat; private String lamp; private String color; //篇幅原因,此处省略get,set方法 @Override public String toString() { return "Car{ " + "wheel=" + wheel + \ + ", engine=" + engine + \ + ", seat=" + seat + \ + ", lamp=" + lamp + \ + ", color=" + color + \ + }; } }抽象Builder类,指定建造复杂对象步骤
public abstract class Builder { public abstract void buildWheel(); public abstract void buildSeat(); public abstract void buildLamp(); public abstract void buildColor(); public abstract void buildEngine(); public abstract Car getCar(); }具体Builder类,实现复杂对象具体建造过程和内容
public class ConcreteBuilder extends Builder { private Car car; public ConcreteBuilder() { car = new Car(); } @Override public void buildWheel() { car.setWheel("wheel"); } @Override public void buildSeat() { car.setSeat("seat"); } @Override public void buildLamp() { car.setLamp("lamp"); } @Override public void buildColor() { car.setColor("color"); } @Override public void buildEngine() { car.setEngine("engine"); } //返回构建好的汽车模型 @Override public Car getCar() { return car; } }Director类,决定了复杂对象的创建过程。
public class CarDirector { public Car createCar(Builder builder){ builder.buildWheel(); builder.buildSeat(); builder.buildLamp(); builder.buildColor(); builder.buildEngine(); return builder.getCar(); } }客户端这样使用
public class BuilderClient { public static void main(String[] args){ CarDirector carDirector = new CarDirector(); //通过Director创建具体对象,不关心对象的创建过程 Car car = carDirector.createCar(new ConcreteBuilder()); System.out.println(car.toString()); } }无导演
无导演模式感觉日常开发中用的比较多,但凡见到形似这样的代码,大概率就是亿华云建造者模式了。
Car car = concreteBuilderA.buildEngine("engine") .buildLamp("lamp") .buildSeat("seat") .buildColor("color") //.buildWheel("wheel") .build();老规矩先来看一下UML图,来个整体的认识。
同样来看一下具体代码实现,还是以创建汽车为例,所以Car的代码不在重复给出。
Builder类
public abstract class BuilderA { //返回builder自身 abstract BuilderA buildWheel(String wheel); abstract BuilderA buildEngine(String engine); abstract BuilderA buildLamp(String lamp); abstract BuilderA buildSeat(String seat); abstract BuilderA buildColor(String color); abstract Car build(); }具体Builder,负责对象的具体创建工作。
public class ConcreteBuilderA extends BuilderA { private Car car; public ConcreteBuilderA() { car = new Car(); } @Override BuilderA buildWheel(String wheel) { car.setWheel(wheel); return this; } @Override BuilderA buildEngine(String engine) { car.setEngine("engine"); return this; } @Override BuilderA buildLamp(String lamp) { car.setLamp("lamp"); return this; } @Override BuilderA buildSeat(String seat) { car.setSeat("seat"); return this; } @Override BuilderA buildColor(String color) { car.setColor("color"); return this; } @Override Car build() { return car; } }客户端这样使用
public class BuilderAClient { public static void main(String[] args){ ConcreteBuilderA concreteBuilderA = new ConcreteBuilderA(); Car car = concreteBuilderA.buildEngine("engine") .buildLamp("lamp") .buildSeat("seat") .buildColor("color") //.buildWheel("wheel") .build(); System.out.println(car.toString()); } }总结
建造者模式是创建型模式之一,所谓的没有Director的模式,只不过是把建造过程留给了客户端,让使用者自己决定怎样创建对象。无Director模式的实现关键是Builder类里面构建每个组件的方法都是返回Builder自己。高防服务器