Builder概述
玩具代码案例 - 汽车车间
抽象Builder角色
ICarBuilder
package online.javabook.gof.creational.patterns4.builder.car.builder.api;import online.javabook.gof.creational.patterns4.builder.car.product.main.Car;public interface ICarBuilder {public void buildFrame();public void buildEngine();public void buildWheel();public void buildNavigation();public void buildComputer();public Car getCar();}
具体Builder角色
CityCarBuilder
package online.javabook.gof.creational.patterns4.builder.car.builder.impl;import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;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 CityCarBuilder implements ICarBuilder {private Car car = new Car();@Overridepublic void buildFrame() {car.setFrame(new Frame(Color.BLACK));}@Overridepublic void buildEngine() {car.setEngine(new Engine("oil"));}@Overridepublic void buildWheel() {car.setWheel(new Wheel(10));}@Overridepublic void buildNavigation() {car.setNavigation(new Navigation("gps"));}@Overridepublic void buildComputer() {car.setComputer(new Computer("android"));}@Overridepublic Car getCar() {return car;}}
SportCarBuilder
package online.javabook.gof.creational.patterns4.builder.car.builder.impl;import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;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 SportCarBuilder implements ICarBuilder {private Car car = new Car();@Overridepublic void buildFrame() {car.setFrame(new Frame(Color.CYAN));}@Overridepublic void buildEngine() {car.setEngine(new Engine("oil"));}@Overridepublic void buildWheel() {car.setWheel(new Wheel(20));}@Overridepublic void buildNavigation() {car.setNavigation(new Navigation("gps"));}@Overridepublic void buildComputer() {car.setComputer(new Computer("windows"));}@Overridepublic Car getCar() {return car;}}
SuvCarBuilder
package online.javabook.gof.creational.patterns4.builder.car.builder.impl;import online.javabook.gof.creational.patterns4.builder.car.builder.api.ICarBuilder;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 SuvCarBuilder implements ICarBuilder {private Car car = new Car();@Overridepublic void buildFrame() {car.setFrame(new Frame(Color.RED));}@Overridepublic void buildEngine() {car.setEngine(new Engine("oil"));}@Overridepublic void buildWheel() {car.setWheel(new Wheel(30));}@Overridepublic void buildNavigation() {car.setNavigation(new Navigation("beidou"));}@Overridepublic void buildComputer() {car.setComputer(new Computer("ios"));}@Overridepublic Car getCar() {return car;}}
主体产品角色
汽车和零件之间是主体和局部的关系
Car
package online.javabook.gof.creational.patterns4.builder.car.product.main;import online.javabook.gof.creational.patterns4.builder.car.product.part.*;public class Car {private Frame frame;private Engine engine;private Wheel wheel;private Navigation navigation;private Computer computer;public Frame getFrame() {return frame;}public void setFrame(Frame frame) {this.frame = frame;}public Engine getEngine() {return engine;}public void setEngine(Engine engine) {this.engine = engine;}public Wheel getWheel() {return wheel;}public void setWheel(Wheel wheel) {this.wheel = wheel;}public Navigation getNavigation() {return navigation;}public void setNavigation(Navigation navigation) {this.navigation = navigation;}public Computer getComputer() {return computer;}public void setComputer(Computer computer) {this.computer = computer;}@Overridepublic String toString() {return "Car{" +"frame=" + frame +", engine=" + engine +", wheel=" + wheel +", navigation=" + navigation +", computer=" + computer +'}';}}
局部产品角色
Computer
package online.javabook.gof.creational.patterns4.builder.car.product.part;public class Computer {private String os;public Computer(String os) {this.os = os;}public String getOs() {return os;}@Overridepublic String toString() {return "Computer{" +"os='" + os + '\'' +'}';}}
Engine
package online.javabook.gof.creational.patterns4.builder.car.product.part;public class Engine {private String type;public Engine(String type) {this.type = type;}public String getType() {return type;}@Overridepublic String toString() {return "Engine{" +"type='" + type + '\'' +'}';}}
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'}}

