Builder概述

Builder - 图1

玩具代码案例 - 汽车车间

抽象Builder角色

ICarBuilder

  1. package online.javabook.gof.creational.patterns4.builder.car.builder.api;
  2. import online.javabook.gof.creational.patterns4.builder.car.product.main.Car;
  3. public interface ICarBuilder {
  4. public void buildFrame();
  5. public void buildEngine();
  6. public void buildWheel();
  7. public void buildNavigation();
  8. public void buildComputer();
  9. public Car getCar();
  10. }

具体Builder角色

CityCarBuilder

  1. package online.javabook.gof.creational.patterns4.builder.car.builder.impl;
  2. import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;
  3. import online.javabook.gof.creational.patterns4.builder.car.product.part.Frame;
  4. import online.javabook.gof.creational.patterns4.builder.car.product.part.*;
  5. import online.javabook.gof.creational.patterns4.builder.car.product.main.Car;
  6. import java.awt.*;
  7. public class CityCarBuilder implements ICarBuilder {
  8. private Car car = new Car();
  9. @Override
  10. public void buildFrame() {
  11. car.setFrame(new Frame(Color.BLACK));
  12. }
  13. @Override
  14. public void buildEngine() {
  15. car.setEngine(new Engine("oil"));
  16. }
  17. @Override
  18. public void buildWheel() {
  19. car.setWheel(new Wheel(10));
  20. }
  21. @Override
  22. public void buildNavigation() {
  23. car.setNavigation(new Navigation("gps"));
  24. }
  25. @Override
  26. public void buildComputer() {
  27. car.setComputer(new Computer("android"));
  28. }
  29. @Override
  30. public Car getCar() {
  31. return car;
  32. }
  33. }

SportCarBuilder

  1. package online.javabook.gof.creational.patterns4.builder.car.builder.impl;
  2. import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;
  3. import online.javabook.gof.creational.patterns4.builder.car.product.part.Frame;
  4. import online.javabook.gof.creational.patterns4.builder.car.product.part.*;
  5. import online.javabook.gof.creational.patterns4.builder.car.product.main.Car;
  6. import java.awt.*;
  7. public class SportCarBuilder implements ICarBuilder {
  8. private Car car = new Car();
  9. @Override
  10. public void buildFrame() {
  11. car.setFrame(new Frame(Color.CYAN));
  12. }
  13. @Override
  14. public void buildEngine() {
  15. car.setEngine(new Engine("oil"));
  16. }
  17. @Override
  18. public void buildWheel() {
  19. car.setWheel(new Wheel(20));
  20. }
  21. @Override
  22. public void buildNavigation() {
  23. car.setNavigation(new Navigation("gps"));
  24. }
  25. @Override
  26. public void buildComputer() {
  27. car.setComputer(new Computer("windows"));
  28. }
  29. @Override
  30. public Car getCar() {
  31. return car;
  32. }
  33. }

SuvCarBuilder

  1. package online.javabook.gof.creational.patterns4.builder.car.builder.impl;
  2. import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;
  3. import online.javabook.gof.creational.patterns4.builder.car.product.part.Frame;
  4. import online.javabook.gof.creational.patterns4.builder.car.product.part.*;
  5. import online.javabook.gof.creational.patterns4.builder.car.product.main.Car;
  6. import java.awt.*;
  7. public class SuvCarBuilder implements ICarBuilder {
  8. private Car car = new Car();
  9. @Override
  10. public void buildFrame() {
  11. car.setFrame(new Frame(Color.RED));
  12. }
  13. @Override
  14. public void buildEngine() {
  15. car.setEngine(new Engine("oil"));
  16. }
  17. @Override
  18. public void buildWheel() {
  19. car.setWheel(new Wheel(30));
  20. }
  21. @Override
  22. public void buildNavigation() {
  23. car.setNavigation(new Navigation("beidou"));
  24. }
  25. @Override
  26. public void buildComputer() {
  27. car.setComputer(new Computer("ios"));
  28. }
  29. @Override
  30. public Car getCar() {
  31. return car;
  32. }
  33. }

主体产品角色

汽车和零件之间是主体和局部的关系

Car

  1. package online.javabook.gof.creational.patterns4.builder.car.product.main;
  2. import online.javabook.gof.creational.patterns4.builder.car.product.part.*;
  3. public class Car {
  4. private Frame frame;
  5. private Engine engine;
  6. private Wheel wheel;
  7. private Navigation navigation;
  8. private Computer computer;
  9. public Frame getFrame() {
  10. return frame;
  11. }
  12. public void setFrame(Frame frame) {
  13. this.frame = frame;
  14. }
  15. public Engine getEngine() {
  16. return engine;
  17. }
  18. public void setEngine(Engine engine) {
  19. this.engine = engine;
  20. }
  21. public Wheel getWheel() {
  22. return wheel;
  23. }
  24. public void setWheel(Wheel wheel) {
  25. this.wheel = wheel;
  26. }
  27. public Navigation getNavigation() {
  28. return navigation;
  29. }
  30. public void setNavigation(Navigation navigation) {
  31. this.navigation = navigation;
  32. }
  33. public Computer getComputer() {
  34. return computer;
  35. }
  36. public void setComputer(Computer computer) {
  37. this.computer = computer;
  38. }
  39. @Override
  40. public String toString() {
  41. return "Car{" +
  42. "frame=" + frame +
  43. ", engine=" + engine +
  44. ", wheel=" + wheel +
  45. ", navigation=" + navigation +
  46. ", computer=" + computer +
  47. '}';
  48. }
  49. }

局部产品角色

Computer

  1. package online.javabook.gof.creational.patterns4.builder.car.product.part;
  2. public class Computer {
  3. private String os;
  4. public Computer(String os) {
  5. this.os = os;
  6. }
  7. public String getOs() {
  8. return os;
  9. }
  10. @Override
  11. public String toString() {
  12. return "Computer{" +
  13. "os='" + os + '\'' +
  14. '}';
  15. }
  16. }

Engine

  1. package online.javabook.gof.creational.patterns4.builder.car.product.part;
  2. public class Engine {
  3. private String type;
  4. public Engine(String type) {
  5. this.type = type;
  6. }
  7. public String getType() {
  8. return type;
  9. }
  10. @Override
  11. public String toString() {
  12. return "Engine{" +
  13. "type='" + type + '\'' +
  14. '}';
  15. }
  16. }

Frame

package online.javabook.gof.creational.patterns4.builder.car.product.part;

import java.awt.*;

public class Frame {

    private Color color;

    public Frame(Color color) {
        this.color = color;
    }

    public Color getColor() {
        return color;
    }

    @Override
    public String toString() {
        return "Frame{" +
                "color=" + color +
                '}';
    }
}

Navigation

package online.javabook.gof.creational.patterns4.builder.car.product.part;

public class Navigation {

    private String gps;

    public Navigation(String gps) {
        this.gps = gps;
    }

    public String getGps() {
        return gps;
    }

    @Override
    public String toString() {
        return "Navigation{" +
                "gps='" + gps + '\'' +
                '}';
    }
}

Wheel

package online.javabook.gof.creational.patterns4.builder.car.product.part;

public class Wheel {

    private int size;

    public Wheel(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    @Override
    public String toString() {
        return "Wheel{" +
                "size=" + size +
                '}';
    }
}

Director角色

Director负责指挥建造者完成生产,Director无需关心建造者是如何工作的,只需在更高的层次组织建造者工作即可,也就是说建造者的主体逻辑会非常简洁,调整建造者会非常容易

package online.javabook.gof.creational.patterns4.builder.car.director.api;

import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;

public class CarDirector {

    private ICarBuilder carBuilder;

    public CarDirector(ICarBuilder carBuilder) {
        this.carBuilder = carBuilder;
    }

    public void construct() {
        carBuilder.buildFrame();
        carBuilder.buildEngine();
        carBuilder.buildWheel();
        carBuilder.buildComputer();
        carBuilder.buildNavigation();
    }
}

不基于Builder模式的实现

Main

package online.javabook.gof.creational.patterns4.builder.car.app.bad;

import online.javabook.gof.creational.patterns4.builder.car.product.part.Frame;
import online.javabook.gof.creational.patterns4.builder.car.product.part.*;
import online.javabook.gof.creational.patterns4.builder.car.product.main.Car;

import java.awt.*;

public class Main {
    public static void main(String[] args) {

        Frame frame = null;
        Engine engine = null;
        Wheel wheel = null;
        Computer computer = null;
        Navigation navigation = null;

        String type = "city";
        if(type.equals("city")) {
            frame = new Frame(Color.BLACK);
            engine = new Engine("oil");
            wheel = new Wheel(30);
            computer = new Computer("android");
            navigation = new Navigation("gps");

        }else if(type.equals("suv")) {
            frame = new Frame(Color.RED);
            engine = new Engine("oil");
            wheel = new Wheel(20);
            computer = new Computer("ios");
            navigation = new Navigation("gps");

        }else if(type.equals("city")) {
            frame = new Frame(Color.CYAN);
            engine = new Engine("oil");
            wheel = new Wheel(30);
            computer = new Computer("windows");
            navigation = new Navigation("beidou");

        }

        Car car = new Car();
        car.setFrame(frame);
        car.setEngine(engine);
        car.setWheel(wheel);
        car.setComputer(computer);
        car.setNavigation(navigation);

        System.out.println(car);
    }
}

Console

Car{frame=Frame{color=java.awt.Color[r=0,g=0,b=0]}, engine=Engine{type='oil'}, wheel=Wheel{size=30}, navigation=Navigation{gps='gps'}, computer=Computer{os='android'}}

基于Builder模式的实现

Main

package online.javabook.gof.creational.patterns4.builder.car.app.good;

import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;
import online.javabook.gof.creational.patterns4.builder.car.builder.impl.CityCarBuilder;
import online.javabook.gof.creational.patterns4.builder.car.builder.impl.SportCarBuilder;
import online.javabook.gof.creational.patterns4.builder.car.builder.impl.SuvCarBuilder;
import online.javabook.gof.creational.patterns4.builder.car.director.api.CarDirector;
import online.javabook.gof.creational.patterns4.builder.car.product.main.Car;

public class Main {
    public static void main(String[] args) {

        ICarBuilder carBuilder = null;

        String type = "city";
        if(type.equals("city")) {
            carBuilder = new CityCarBuilder();

        }else if(type.equals("suv")) {
            carBuilder = new SuvCarBuilder();

        }else if(type.equals("city")) {
            carBuilder = new SportCarBuilder();
        }

        CarDirector carDirector = new CarDirector(carBuilder);
        carDirector.construct();
        Car car = carBuilder.getCar();
        System.out.println(car);
    }
}

Console

Car{frame=Frame{color=java.awt.Color[r=0,g=0,b=0]}, engine=Engine{type='oil'}, wheel=Wheel{size=10}, navigation=Navigation{gps='gps'}, computer=Computer{os='android'}}