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();
@Override
public void buildFrame() {
car.setFrame(new Frame(Color.BLACK));
}
@Override
public void buildEngine() {
car.setEngine(new Engine("oil"));
}
@Override
public void buildWheel() {
car.setWheel(new Wheel(10));
}
@Override
public void buildNavigation() {
car.setNavigation(new Navigation("gps"));
}
@Override
public void buildComputer() {
car.setComputer(new Computer("android"));
}
@Override
public 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();
@Override
public void buildFrame() {
car.setFrame(new Frame(Color.CYAN));
}
@Override
public void buildEngine() {
car.setEngine(new Engine("oil"));
}
@Override
public void buildWheel() {
car.setWheel(new Wheel(20));
}
@Override
public void buildNavigation() {
car.setNavigation(new Navigation("gps"));
}
@Override
public void buildComputer() {
car.setComputer(new Computer("windows"));
}
@Override
public 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();
@Override
public void buildFrame() {
car.setFrame(new Frame(Color.RED));
}
@Override
public void buildEngine() {
car.setEngine(new Engine("oil"));
}
@Override
public void buildWheel() {
car.setWheel(new Wheel(30));
}
@Override
public void buildNavigation() {
car.setNavigation(new Navigation("beidou"));
}
@Override
public void buildComputer() {
car.setComputer(new Computer("ios"));
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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'}}