天天看点

23种设计模式之【建造者模式】

定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

讲解:

一个对象(产品),可能有几部分组成。比如一辆汽车,主要由车身、发动机、轮胎、传动系统等组成。这些部件或系统就是对象的表示。而建造者模式将汽车这个复杂对象的构建过程与它的表示分离。也就是说客户只需要告诉建造者模式我想要什么样的汽车(小轿车或大卡车)就可以了。至于汽车是如何生产出来了,客户并不关心。同样的构建过程,构建出的汽车却不相同(小轿车或大卡车)。

类图:

23种设计模式之【建造者模式】

角色:

产品类(Product):具体的产品,一般情况下是一个创建过程比较复杂的产品。

抽象建造者(Builder):抽象类,定义用来创建产品的抽象方法。

建造者(ConcreteBuilder):实现类,实现抽象建造者类,并实现其抽象方法。

导演类(Director):负责调用具体的建造者类,来完成产品的创建工作。

代码:

//产品类Product
class Car {
	private String body;//车身
	private String engine;//发动机
	private String tire;//轮胎
	private String driveSys;//传动系统

	//省略get set方法
}
//抽象建造者Builder
abstract class Builder {
	protected Car = new Car();
    public abstract void buildBody(String body);//建造车身
	public abstract void buildEngine(String engine);//建造发动机
	public abstract void buildTire(String tire);//建造轮胎
	public abstract void builcDriveSys(String driveSys);//建造传动系统
    //获得汽车
	public Car getCar(){
		return car;
	}
}
//小轿车建造者ConcreteBuilder
class CarBuilder extends Builder {
	public void buildBody() {
		car.setBody("小轿车车身");
	}

	public void buildEngine() {
		car.setEngine("小轿车发动机");
	}

	public void buildTire() {
		car.setTire("小轿车轮胎");
	}

	public void builcDriveSys() {
		car.setDriveSys("小轿车传动系统");
	}
}
//大卡车建造者ConcreteBuilder
class TruckBuilder extends Builder {
	public void buildBody() {
		car.setBody("大卡车车身");
	}

	public void buildEngine() {
		car.setEngine("大卡车发动机");
	}

	public void buildTire() {
		car.setTire("大卡车轮胎");
	}

	public void builcDriveSys() {
		car.setDriveSys("大卡车传动系统");
	}
}
//导演类
public class Director {
	private Builder builder;

	public void setBuilder(Builder builder) {
		this.builder = builder;
	}

	public Car construct() {
		builder.buildBody();
		builder.buildEngine();
		builder.buildTire();
		builder.builcDriveSys();
		return builder.getCar();
	}
}
//客户端
public class Client {
	public static void main(String[] args) {
		Director director = new Director();//导演

		Builder carBuilder = CarBuilder();
		director.setBuilder(carBuilder);
		Car car = director.construct();//小轿车

		Builder truckBuilder = TruckBuilder();
		director.setBuilder(truckBuilder);
		Car truck = director.construct();//大卡车
	}
}
           

好处:

  • 符合依赖倒转原则,抽象不应该依赖细节,细节应该依赖于抽象。产品的创建依赖于抽象建造者类,而不依赖于具体的建造者类,产品的创建细节在建造者类中实现。
  • 由于具体的建造者类之间相互独立,这样就可以定制化的实现不同的产品,而不影响其他已实现的功能。
  • 易于扩展,如果现有的建造者无法满足需求,只需要增加一个新的建造者实现类即可,而不会影响其他已实现的功能。

使用场景:

  • 稳定的创建过程,产品对象的创建过程稳定,也就是说抽象建造者类中的抽象方法稳定,不应该出现大的变动。
  • 产品对象的创建过程极其复杂,如果产品对象的创建过于简单,则不适合使用建造者模式。