設計模式之建造者模式

建造者模式

定義:將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以有不同的表示。比如不同的車有不同的牌子、車型、顏色等。客戶端想要白色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》作者說過,方法參數超過三個以上就要考慮使用建造者模式。不足之處望指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章