https://www.bilibili.com/video/av29579073/?p=7
建造者模式是指使用多个简单的对象一步一步建成一个复杂的对象。这个复杂对象的生成分为两个部分,一个是简单对象的生成过程,对应的是Builder类,一个是将这些简单对象进行组建称为最终的复杂对象的类,称为Direct类。
可以看到建造者模式的意图就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
这个也可以看出来建造者模式中的Direct类中的算法较为稳定,而其中需要的Builder类创建的对象却是时常变化的。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
下面还是举视频中的例子,举例飞船的建造。
声明一个飞船对象。
public class AirShip {
private OrbitalModule orbitalModule; //轨道舱
private Engine engine; //发动机
private EscapeTower escapeTower; //逃逸塔
public void launch(){
System.out.println("发射!");
}
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
}
class OrbitalModule{
private String name;
public OrbitalModule(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Engine {
private String name;
public Engine(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class EscapeTower{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public EscapeTower(String name) {
super();
this.name = name;
}
}
然后就是声明一个Builder类接口,表明飞船的创建需要使用哪些简单对象。
public interface AirShipBuilder {
Engine builderEngine();
OrbitalModule builderOrbitalModule();
EscapeTower builderEscapeTower();
}
声明这个接口之后,就可以声明不同的实现类按照需要实现这里面的方法,创建需要的简单对象。
public class SxtAirShipBuilder implements AirShipBuilder {
//StringBuilder, 以后学习XML解析中,JDOM库中的类:DomBuilder,SaxBuilder
@Override
public Engine builderEngine() {
System.out.println("构建尚学堂牌发动机!");
return new Engine("尚学堂牌发动机!");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("构建逃逸塔");
return new EscapeTower("尚学堂牌逃逸塔");
}
@Override
public OrbitalModule builderOrbitalModule() {
System.out.println("构建轨道舱");
return new OrbitalModule("尚学堂牌轨道舱");
}
}
以上就是对Builder类的声明,接下来就是对Direct,也就是导演类的声明了。
public interface AirShipDirector {
/**
* 组装飞船对象
* @return
*/
AirShip directAirShip();
}
具体的实现就交给具体的实现类来做了
public class SxtAirshipDirector implements AirShipDirector {
private AirShipBuilder builder;
public SxtAirshipDirector(AirShipBuilder builder) {
this.builder = builder;
}
@Override
public AirShip directAirShip() {
Engine e = builder.builderEngine();
OrbitalModule o = builder.builderOrbitalModule();
EscapeTower et = builder.builderEscapeTower();
//装配成飞船对象
AirShip ship = new AirShip();
ship.setEngine(e);
ship.setEscapeTower(et);
ship.setOrbitalModule(o);
return ship;
}
}
以上就是对于建造者模式的视频学习,建造者模式相对比较好理解,实际上就是一个创建和组装分离的过程,降低了代码的耦合性。