建造者模式

建造者模式(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 }

 

posted @ 2020-02-11 14:36  ABKing  阅读(131)  评论(0编辑  收藏  举报