赞
踩
需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
现实生活中我们去买车,一般同一辆车会有多个版本,根据配置不一样,分为经典版、舒适版、豪华版等,比如经典版是手动挡手动座椅,舒适版是自动挡全景天窗等。
定义产品角色
@Data public class Car { // 车名称 private String name; // 自动挡 private String automaticCatch; // 手动挡 private String manualTransmission; // 全景天窗 private String panoramicSunroof; // 自动座椅 private String automaticSeat; // 手动座椅 private String manualSeat; // 倒车影像 private String reversingImage; }
一坨坨代码实现
public class CarController { public Car getCarInstance(String carName) { Car car = new Car(); if ("经典版".equals(carName)) { car.setName("经典版"); car.setManualTransmission("手动挡"); } else if ("舒适版".equals(carName)) { car.setName("舒适版"); car.setAutomaticCatch("自动挡"); car.setManualSeat("手动座椅"); } else if ("豪华版".equals(carName)) { car.setName("豪华版"); car.setAutomaticCatch("自动挡"); car.setAutomaticSeat("自动座椅"); car.setReversingImage("倒车影像"); car.setPanoramicSunroof("全景天窗"); } else { throw new IllegalArgumentException("carName is error: carName=" + carName); } return car; } }
测试
@Test
public void test(){
CarController carController = new CarController();
System.out.println(carController.getCarInstance("豪华版").toString());
}
创建抽象建造者类
public abstract class CarBuilder {
public abstract Car buildClassic();
public abstract Car buildComfortable();
public abstract Car buildLuxury();
}
创建具体建造者类
public class CarConcreteBuilder extends CarBuilder { @Override public Car buildClassic() { Car car = new Car(); car.setName("经典版"); car.setManualTransmission("手动挡"); return car; } @Override public Car buildComfortable() { Car car = new Car(); car.setName("舒适版"); car.setAutomaticCatch("自动挡"); car.setManualSeat("手动座椅"); return car; } @Override public Car buildLuxury() { Car car = new Car(); car.setName("豪华版"); car.setAutomaticCatch("自动挡"); car.setAutomaticSeat("自动座椅"); car.setReversingImage("倒车影像"); car.setPanoramicSunroof("全景天窗"); return car; } }
创建我们的导演类
public class CarDirector { private CarBuilder carBuilder; public CarDirector(CarBuilder carBuilder) { this.carBuilder = carBuilder; } public Car classicConstruct() { return carBuilder.buildClassic(); } public Car comfortableConstruct() { return carBuilder.buildComfortable(); } public Car luxuryConstruct() { return carBuilder.buildLuxury(); } }
测试
@Test
public void test(){
CarBuilder carBuilder = new CarConcreteBuilder();
CarDirector carDirector = new CarDirector(carBuilder);
Car comfortableCar = carDirector.luxuryConstruct();
System.out.println(comfortableCar);
}
与工厂模式区别
工厂模式是由工厂类来负责创建对象,而建造者模式也是让具体建造者类负责创建对象,那这两者有什么区别呢?
实际上工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。而建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。
可以形象的解释:
顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。
对于披萨来说,用户又有各种配料可以定制,比如奶酪、西红柿、起司,我们通过建造者模式根据用户选择的不同配料来制作披萨。
在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”
由于具体每个建造者过程是独立的,因此可以对过程更加细化,而不会对其它模块产生影响。
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。