建造者模式
建造者模式(Builder Pattern)应用多个简略的对象一步一步构建成一个简单的对象。这种类型的设计模式属于创立型模式,它提供了一种创建对象的最佳形式。
一个 Builder 类会一步一步结构最终的对象。该 Builder 类是独立于其余对象的。
用意:将一个简单的构建与其示意相拆散,使得同样的构建过程能够创立不同的示意。
次要解决:次要解决在软件系统中,有时候面临着”一个简单对象”的创立工作,其通常由各个局部的子对象用肯定的算法形成;因为需要的变动,这个简单对象的各个局部常常面临着激烈的变动,然而将它们组合在一起的算法却绝对稳固。
何时应用:一些根本部件不会变,而其组合常常变动的时候。
如何解决:将变与不变分来到。
长处:
- 建造者独立,易扩大。
- 便于管制细节危险。
毛病:
1. 产品必须有共同点,范畴有限度。
2. 如外部变动简单,会有很多的建造类。
应用场景: 1、须要生成的对象具备简单的内部结构。 2、须要生成的对象外部属性自身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与整机拆卸的程序。而工厂更专一于整机的制作过程。
当初须要构建很多车辆,车的组成有车轮、外壳、发动机、方向盘等,每个组件有不同品牌,最初须要依据客户需要定制不同的车。(车的总体组成是一样的,组成部件变动)
/**
* @author objcfeng
* @description 车的实体类
* @date 2020/11/2
*/
public class Car {
//车轮
private String wheel;
//外壳
private String shell;
//发动机
private String engine;
//方向盘
private String steeringWheel;
@Override
public String toString() {
return "Car{" +
"wheel='" + wheel + '\'' +
", Shell='" + shell + '\'' +
", engine='" + engine + '\'' +
", steeringWheel='" + steeringWheel + '\'' +
'}';
}
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getShell() {
return shell;
}
public void setShell(String shell) {
this.shell = shell;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getSteeringWheel() {
return steeringWheel;
}
public void setSteeringWheel(String steeringWheel) {
this.steeringWheel = steeringWheel;
}
}
//车的建造者
public abstract class CarBuilder {
//造车轮的办法,因为实际上车轮可能是一个简单对象
public abstract void buildWheel();
//造外壳的办法
public abstract void buildShell();
//造引擎的办法
public abstract void buildEngine();
//造方向盘的办法
public abstract void buildSteeringWheel();
}
建造者实现类,多个品牌组装不同的组件
/**
* @author objcfeng
* @description 飞驰建造者
* @date 2020/11/2
*/
public class BenzBuilder extends CarBuilder {
private Car car=new Car();
@Override
public void buildWheel() {
car.setWheel("上好的车轮");
}
@Override
public void buildShell() {
car.setShell("飞驰外壳");
}
@Override
public void buildEngine() {
car.setEngine("飞驰产发动机");
}
@Override
public void buildSteeringWheel() {
car.setSteeringWheel("有飞驰标识的方向盘");
}
//不须要重写getCar
}
/**
* @author objcfeng
* @description 宝马建造者
* @date 2020/11/2
*/
public class BmwBuilder extends CarBuilder {
private Car car=new Car();
@Override
public void buildWheel() {
car.setWheel("上好的车轮");
}
@Override
public void buildShell() {
car.setShell("宝马外壳");
}
@Override
public void buildEngine() {
car.setEngine("宝马产发动机");
}
@Override
public void buildSteeringWheel() {
car.setSteeringWheel("有宝马标识的方向盘");
}
}
指挥者
/**
* @author objcfeng
* @description 指挥者,领导具体构建者如何构建产品,管制调用先后秩序,并向调用者返回残缺的产品类
* @date 2020/11/2
*/
public class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public Car build(){
builder.buildEngine();
builder.buildShell();
builder.buildSteeringWheel();
builder.buildWheel();
return builder.getCar();
}
}
应用:
public class Main {
public static void main(String[] args) {
CarBuilder builder1=new BmwBuilder();
CarBuilder builder2=new BenzBuilder();
CarDirector carDirector = new CarDirector(builder1);
Car car = carDirector.build();
System.out.println(car);
}
}
输入
Car{wheel='上好的车轮', Shell='宝马外壳', engine='宝马产发动机', steeringWheel='有宝马标识的方向盘'}
发表回复