设计模式之建造者模式

建造者模式

定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示。比如不同的车有不同的牌子、车型、颜色等。客户端想要白色SUV的宝马,或者黑色轿车的宝马,而又不想干涉建造它们,毕竟客户端要处理很多事情,那么就把建造任务交给其他人,返回车给客户端就行,不需要知道怎么建造的。

这里写图片描述

建造者通常包括四个角色:

  • Builder : 抽象建造类,定义建造产品类需要的方法,且实例化产品类。
  • ConcreteBuilder :具体建造类,实现抽象方法,建造产品。
  • Product :产品类,提供属性方法。
  • Director :执行类,负责执行建造流程。

用上面车的例子代码演示建造者模式。

Builder 汽车抽象建造者

    public abstract class CarBuilder {
        protected Car car = new Car();

        protected abstract void buildColor();
        protected abstract void buildType();
        protected abstract void buildBrand();

        public Car getCar() {
            return car;
        }
    }

ConcreteBuilder 奔驰具体建造者


    public class BenzBuilder extends CarBuilder{

        protected void buildColor() {
            car.setBrand("奔驰");
        }

        protected void buildType() {
            car.setType("轿车");
        }

        protected void buildBrand() {
            car.setColor("黑色");
        }

    }

Product 车属性

    public class Car {
    private String color;
    private String type;
    private String brand;

    getter/setter();
    }

Director 汽车执行者

    public class CarDiretor {

        CarBuilder carbuilder;

        public void setCarbuilder(CarBuilder carbuilder) {
            this.carbuilder = carbuilder;
        }

        public Car getCar() {
            carbuilder.buildBrand();
            carbuilder.buildColor();
            carbuilder.buildType();
            return carbuilder.getCar();
        }

    }

客户端

    CarDiretor carDiretor = new CarDiretor();
    carDiretor.setCarbuilder(new BenzBuilder());
    Car car = carDiretor.getCar();//得出黑色轿车奔驰

到这都会有疑惑。绕了一大圈还不如new一个car直接setter/getter。确实如此。但是别忘了建造者模式的初衷,是与客户端分离。需要建造其他车只要新建Builder就好了,客户端不需要知道里面怎么建造。

    CarDiretor carDiretor = new CarDiretor();
    carDiretor.setCarbuilder(new BMWBuilder());
    Car car = carDiretor.getCar();//得出宝马

简化模式

上面也看到了,建造一辆车至少写这么多类,而且不同类型还需要创建不同的建造者,这相当麻烦,因此建造者模式坐冷板凳。如今建造者模式改头换面,大牛们简化这么繁琐的建造者模式。不需要抽象Builder和Director执行者,改写具体Builder,再加上链式编程使代码更加灵活,更加简单。

    public class CarBuilder {

        private Car car = new Car();

        public CarBuilder() {
            //初始化的时候 可以设置默认值
            car.setColor("白色");//默认白色
        }

        public CarBuilder setColor(String color) {
            car.setColor(color);
            return this;
        }

        public CarBuilder setType(String type) {
            car.setType(type);
            return this;
        }

        public CarBuilder setBrand(String brand) {
            car.setBrand(brand);
            return this;
        }

        public Car build() {
            return car;
        }
    }

客户端

    Car car1 = new CarBuilder().setBrand("奔驰").setType("轿车").build();//白色轿车奔驰
    Car car2 = new CarBuilder().setBrand("宝马").setColor("红色").setType("SUV").build();//红色SUV宝马

只要两个类就搞定了。不需要的部分也可以去掉,比如红色宝马,SUV奔驰之类的组合。通常建造者模式都是使用这种方式。

总述

建造者模式是属于创建型模式,它负责创建不同部件组合一起的一种对象。使用场景也有很多,《Effective Java》作者说过,方法参数超过三个以上就要考虑使用建造者模式。不足之处望指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值