建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
在之前的工厂模式中,用户为了获得Car,需要和引擎(Engine)和轮胎(Tyre)打交道。可是我们不希望把车子内部的实现告诉用户,只希望用户需要Car时,把Car给他,这样,我们就引入了建造者模式。
建造者模式主要的目的是为了解除创建和装配的耦合,通过使用Builder类来控制所有组建的创建,Director类来进行组件的装配,只需要对用户开放Director接口,用户就可以直接获得完整的产品。只和Car打交道,而不和Engine和Tyre打交道。
创建car类和相应的组件:引擎(Engine)和轮胎(Tyre)
1 package top.bigking.builder; 2 3 /** 4 * @Author ABKing 5 * @Date 2020/2/11 上午11:07 6 **/ 7 public class Car { 8 private Engine engine; 9 private Tyre tyre; 10 11 public void run(){ 12 System.out.println("车子在跑"); 13 } 14 public Engine getEngine() { 15 return engine; 16 } 17 18 public void setEngine(Engine engine) { 19 this.engine = engine; 20 } 21 22 public Tyre getTyre() { 23 return tyre; 24 } 25 26 public void setTyre(Tyre tyre) { 27 this.tyre = tyre; 28 } 29 } 30 class Engine{ 31 private String name; 32 33 public Engine(String name) { 34 this.name = name; 35 } 36 37 public String getName() { 38 return name; 39 } 40 41 public void setName(String name) { 42 this.name = name; 43 } 44 } 45 class Tyre{ 46 private String name; 47 48 public Tyre(String name) { 49 this.name = name; 50 } 51 52 public String getName() { 53 return name; 54 } 55 56 public void setName(String name) { 57 this.name = name; 58 } 59 }
接下来写Builder接口和Director接口:
1 package top.bigking.builder; 2 3 /** 4 * @Author ABKing 5 * @Date 2020/2/11 上午11:10 6 **/ 7 public interface CarBuilder { 8 public Engine buildEngine(); 9 public Tyre buildTyre(); 10 }
1 package top.bigking.builder; 2 3 /** 4 * @Author ABKing 5 * @Date 2020/2/11 上午11:10 6 **/ 7 public interface CarDirector { 8 public Car directCar(); 9 }
为了获得我们的产品——车,我们需要实现这两个接口:
1 package top.bigking.builder; 2 3 /** 4 * @Author ABKing 5 * @Date 2020/2/11 上午11:17 6 **/ 7 public class BigKingCarBuilder implements CarBuilder { 8 @Override 9 public Engine buildEngine() { 10 System.out.println("建造发动机"); 11 return new Engine("发动机"); 12 } 13 14 @Override 15 public Tyre buildTyre() { 16 System.out.println("建造轮胎"); 17 return new Tyre("轮胎"); 18 } 19 }
1 package top.bigking.builder; 2 3 /** 4 * @Author ABKing 5 * @Date 2020/2/11 上午11:21 6 **/ 7 public class BigKingCarDirector implements CarDirector { 8 private CarBuilder carBuilder; 9 10 public BigKingCarDirector(CarBuilder carBuilder) { 11 this.carBuilder = carBuilder; 12 } 13 14 @Override 15 public Car directCar() { 16 Engine engine = carBuilder.buildEngine(); 17 Tyre tyre = carBuilder.buildTyre(); 18 19 Car car = new Car(); 20 car.setEngine(engine); 21 car.setTyre(tyre); 22 return car; 23 } 24 }
测试类如下:
1 package top.bigking.builder; 2 3 import org.junit.Test; 4 5 /** 6 * @Author ABKing 7 * @Date 2020/2/11 下午2:18 8 **/ 9 public class TestBuilder { 10 @Test 11 public void testBuilder(){ 12 CarDirector carDirector = new BigKingCarDirector(new BigKingCarBuilder()); 13 Car car = carDirector.directCar(); 14 car.run(); 15 } 16 }