建造者模式

£可爱£侵袭症+ 提交于 2020-03-06 06:48:56

场景:

  我们需要建造一个复杂的产品。比如:神舟飞船、iphone。这些复杂的产品创建。有这样一个问题需要处理:装配这些子组件是不是有个步骤问题?

  在实际开发中,什么所需要的对象构建时,也非常复杂,有很多步骤需要处理时。

  

建造模式的本质:

  分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。 

       由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法与装配算法的解耦,实现了更好的复用。

 

下面用建造飞船的例子来说明:

 

  //创建飞船类和对应的模块类

package com.note.pattern.build;

//飞船类
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 EscapeTower(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

  //创建Builder接口与其实现类

  

package com.note.pattern.build;

public interface AirShipBuilder {
	
	OrbitalModule buildOrbitalModule();
	Engine buildEngine();
	EscapeTower buildEscapeTower();
	
}

  

package com.note.pattern.build;

public class ChinaAirShipBuild implements AirShipBuilder{

	@Override
	public OrbitalModule buildOrbitalModule() {
		System.out.println("构建中国牌轨道舱!");
		return new OrbitalModule("中国牌轨道舱");
	}

	@Override
	public Engine buildEngine() {
		System.out.println("构建中国牌发动机!");
		return new Engine("中国牌发动机");
	}

	@Override
	public EscapeTower buildEscapeTower() {
		System.out.println("构建中国牌逃逸塔!");
		return new EscapeTower("中国牌逃逸塔");
	}

}

  

  //创建Director接口与实现类,负责组装:

 

package com.note.pattern.build;

public interface AirShipDirector {
	
	//组装飞船对象
	AirShip directAirShip();
	
}

  

package com.note.pattern.build;

public class ChinaAirShipDirector implements AirShipDirector{
	
	private AirShipBuilder builder;

    public ChinaAirShipDirector(AirShipBuilder builder) {
        this.builder = builder;
    }
	

	@Override
	public AirShip directAirShip() {
		
		Engine e = builder.buildEngine();
	    OrbitalModule o = builder.buildOrbitalModule();
	    EscapeTower et = builder.buildEscapeTower();
		
	    //装配成飞船对象
        AirShip ship = new AirShip();
        ship.setEngine(e);
        ship.setEscapeTower(et);
        ship.setOrbitalModule(o);
		return ship;
	}

}

  

  //客户端使用

  

package com.note.pattern.build;

public class Client {
	
	public static void main(String[] args) {
		
		 AirShipDirector director = new ChinaAirShipDirector(new ChinaAirShipBuild());
		 AirShip airShip = director.directAirShip();
		 
		 System.out.println(airShip.getEngine().getName());
		 
		 airShip.launch();
		
	}
	
}

  

开发中应用场景:

  StringBuild类的append方法

  Sql中的PreparedStatement

  JDOM中,DomBuilder、SAXBuilder

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!