什么是建造者模式,GOF给出的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话其实表达的意思就是把构建对象这个复杂的过程和组成这个对象的部件解耦,使得相同的转配方式可以装配出不同的产品。
下面是建造者模式的类图:
下面我们用构建汽车的例子来介绍一下什么是建造者模式:
1.首先我们先创建一个汽车的产品对象:
public class Car { private String tires; //轮胎 private String engine; //引擎 private String steeringWheel; //方向盘 public String getTires() { return tires; } public void setTires(String tires) { this.tires = tires; } public String getEngine() { return engine; } public void setEngine(String engine) { this.engine = engine; } public String getSteeringWheel() { return steeringWheel; } public void setSteeringWheel(String steeringWheel) { this.steeringWheel = steeringWheel; } }
2.创建一个抽象的汽车建造类
public abstract class CarBuilder { public Car car= new Car(); public abstract void buildTires(); public abstract void buildEngine(); public abstract void buildSteeringWheel(); public Car buildCar(){ return this.car; } }
3.创建一个具体的汽车建造类(专门建造跑车)
public class SprotCarBuilder extends CarBuilder{ @Override public void buildTires() { this.car.setTires("跑车的轮胎"); } @Override public void buildEngine() { this.car.setEngine("跑车的引擎"); } @Override public void buildSteeringWheel() { this.car.setSteeringWheel("跑车的方向盘"); } }
4.创建一个指挥者类(调用建造类创建产品)
public class CarDirector { private CarBuilder carBuilder; public CarDirector(CarBuilder carBuilder){ this.carBuilder = carBuilder; } public Car construct(){ this.carBuilder.buildEngine(); this.carBuilder.buildSteeringWheel(); this.carBuilder.buildTires(); return this.carBuilder.buildCar(); } }
5.客户端调用代码:
public class Custom { public static void main(String[] args) { CarBuilder carBuilder = new SprotCarBuilder(); CarDirector director = new CarDirector(carBuilder); Car car = director.construct(); System.out.println(car.getEngine()); System.out.println(car.getSteeringWheel()); System.out.println(car.getTires()); } }
使用建造者模式对于用户而言只需要知道创建具体产品的建造者即可,对于如何创建对象用户是不关心的。当需要创建其他的产品对象时只需要创建对应的建造类即可,符合设计模式中的开闭原则,但是如果每一个产品类都使用建造者模式会出现大量的建造者类,程序将变得难以维护,所以如果我们所需要的产品类并没有想象的那么复杂建议就没有必要使用建造者模式。