java 兴修者(Builder)模式

java 建造者(Builder)模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。


Builder模式的应用场景
- 对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法


Builder模式的应用范例
下面我们举个例子来加深我们对Builder模式的理解。
比如我们要通过一个汽车加工厂,组装一辆汽车;汽车由车头,车身,车尾3部分组成;它的基本组装步骤是:
- 组装车头
- 组装车身
- 组装车尾

不管被组装的是吉普车,卡车,还是公交车,它们都可以各自重新定义车头,车身与车尾的组装方法;而通过这些被重新定义的组装方法,通过相同的组装步骤就可以组装具有不同属性的各类汽车了。
通过上面的分析,我们知道,该范例满足Builder模式的应用场景所提到的条件:
- 对象的创建:我们需要创建汽车对象
- 创建的是一个复合对象:我们需要创建的汽车对象是具有车头,车身,车尾等复合属性的复合对象
- 关注对象创建的各部分的创建过程:吉普车,卡车等对车头,车身,车尾的组装方法不尽相同


下面我们用Builder设计模式来抽象以上组装过程:
- CarDirector:汽车组装操作的封装类
- CarBuilder:汽车组装抽象类
- JeepBuilder:吉普车组装类,继承自CarBuilder类。
- Car:汽车类,包括车头,车身,车尾等属性。相当于产品类。由CarBuilder/JeepBuilder等创建。

源代码

    //汽车类 
    public class Car { 
        //车头 
        private String head; 
        //车身 
        private String body; 
        //车尾 
        private String tail; 
     
        public String getBody() { 
            return body; 
        } 
        public void setBody(String body) { 
            this.body = body; 
        } 
        public String getHead() { 
            return head; 
        } 
        public void setHead(String head) { 
            this.head = head; 
        } 
        public String getTail() { 
            return tail; 
        } 
        public void setTail(String tail) { 
            this.tail = tail; 
        } 
    } 
     
     
    //汽车组装抽象类 
    public abstract class CarBuilder { 
        //组装车头 
        public abstract void makeHead(); 
        //组装车身 
        public abstract void makeBody(); 
        //组装车尾 
        public abstract void makeTail(); 
        //得到被组装好的汽车对象 
        public abstract Car getCar(); 
    } 
     
    //吉普车组装类 
    public class JeepBuilder extends CarBuilder { 
        Car car = new Car(); 
     
        //组装车头 
        public void makeHead() { 
            car.setHead("Jeep head"); 
        } 
        //组装车身 
        public void makeBody() { 
            car.setHead("Jeep body"); 
        } 
        //组装车尾 
        public void makeTail() { 
            car.setHead("Jeep tail"); 
        } 
     
        public Car getCar() { 
            return car; 
        } 
    } 
     
     
    //汽车组装操作的封装类:该类封装了对整个汽车的组装操作 
    public class CarDirector { 
        //汽车的组装操作 
        public void makeCar(CarBuilder builder) { 
            //组装车头 
            builder.makeHead(); 
            //组装车身 
            builder.makeBody(); 
            //组装车尾 
            builder.makeTail(); 
        } 
    } 
     
    //调用 
    public class Client { 
        public static void main(String[] args) { 
            CarDirector director = new CarDirector(); 
     
            //创建吉普车生成器(工厂) 
            CarBuilder b = new JeepBuilder(); 
            //调用CarDirector组装整个汽车 
            director.makeCar(b); 
     
            //得到组装好的汽车 
            Car car = b.getCar(); 
            System.out.println(car.getHead()); 
            System.out.println(car.getBody()); 
            System.out.println(car.getTail()); 
        } 
    }


上面演示了吉普车(Jeep)的生产过程,如果需要创建公交车(Bus),我们可以依葫芦画瓢,使用一个继承自CarBuilder的BusBuilder,便可简单地生产一个具有与吉普车不同的车头,车身,车尾的汽车来。