设计模式之建造者模式
建造者模式(Builder),其意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂对象,它允许用户只通过制定复杂对象的类型和内容就可以构建它们,用户并不知道内部的具体构建细节。好比你去餐厅用餐,你需要告诉接待员你需要的菜品,中间过程接待员如何把菜单拿给传菜人员,又如何从到厨师那里,后来菜又如何传到你这里,你只管等待这个过程然后就有菜吃了。
其适用性:
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
如图建造者模式允许用户只通过指定复杂对象的类型和内容就可以构建它们,由具体的生成器来生产产品, 在此有个导向器(Director)看似一个多余的类,在应用中作用好像不大,其实它的作用是明显的。第一,它隔离了客户及生产过程,第二,它负责控制产品的生成过程,比如你是客户你要去买车,只要选好车型、颜色、内外饰等,剩下的交给Director就行了,它会告诉你去某个车间取车就可以了。
下面例子:汽车生成器用来生产汽车,包括车架、引擎、轮胎、车门等,有个它的实现者桥车生成器(此处应该用继承抽象类),在这个导向器的类里利用多态性,可以使用顶层类(接口)实现构建汽车的过程,而具体的实现由其子类或者实现类去做,这正是Director的作用,也正是建造者能将构造代码和表示代码分离的原因。
Vehicle.java
public class Vehicle {
private String frame;
private String engine;
private String wheels;
private String doors;
public String getFrame() {
return frame;
}
....getter/setter....
}
Car类继承了它,并添加了run方法,Car.java
public class Car extends Vehicle {
public void run(){
System.out.println("car runing!");
}
}
下面是汽车构建器,VehicleBuilder.java
public interface VehicleBuilder {
public void buildFrame();
public void buildEngine();
public void buildWheels();
public void buildDoors();
public Vehicle buildVehicle();
}
CarBuilder.java类实现了这个构建接口,它详细规划了整个构建过程。
public class CarBuilder implements VehicleBuilder {
private Vehicle car;
public CarBuilder(){
car = new Car();
}
@Override
public void buildFrame() {
// TODO Auto-generated method stub
car.setFrame("frame");
System.out.println("build car's frame!");
}
@Override
public void buildEngine() {
// TODO Auto-generated method stub
car.setEngine("engine");
System.out.println("build car's engine!");
}
@Override
public void buildWheels() {
// TODO Auto-generated method stub
car.setWheels("wheels");
System.out.println("build car's wheels!");
}
@Override
public void buildDoors() {
// TODO Auto-generated method stub
car.setDoors("doors");
System.out.println("build car's doors!");
}
@Override
public Vehicle buildVehicle() {
// TODO Auto-generated method stub
return car;
}
}
最后一个便是导向器类,它来进行各个模块的创建,最后调用buildVehicle()得到产品。 Director.java
public class Director {
public Vehicle contructVehicle(VehicleBuilder vb){
vb.buildFrame();
vb.buildEngine();
vb.buildWheels();
vb.buildDoors();
return vb.buildVehicle();
}
}
测试类如下Main.java:
public class Main {
public static void main(String[]args){
VehicleBuilder builder = new CarBuilder();
Director director = new Director();
Car car = (Car) director.contructVehicle(builder);
car.run();
}
}
如果功能扩展,需要定义一个Builder类,这样便造成每个具体产品都要一个具体创建者类对应,且产品之间的差异性也使得构建过程内部复杂化。建造者模式使得逐步构造一个复杂对象,然后在使用时要灵活运用。