建造者模式

建造者模式:

建造模式的本質:
        分離了對象子組件的單獨構造(由Builder來負責)和裝配(由Director負責)。 從而可以構造出複雜的對象。

這個模式適用於:某個對象的構建過程複雜的情況下使用。
– 由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。也就是實現了構建算法、裝配算法的解耦,實現了更好的複用。

建造者開發中應用場景:
    – StringBuilder類的append方法
    – SQL中的PreparedStatement – JDOM中,DomBuilder、SAXBuilder

建造者模式案例:

//軌道艙
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;
	}
}
//飛船的三個組件
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;
	}
}
//構建者(用來構造飛船的各個組件)
public interface AirShipBuilder {
	Engine builderEngine();
	OrbitalModule builderOrbitalModule();
	EscapeTower  builderEscapeTower();
}
//裝配者(負責裝配飛船)
public interface AirShipDirector {

	 //組裝飛船對象
    AirShip   directAirShip();
}
//構建者實現類
public class MyAirShipBuilder implements AirShipBuilder {
	
	@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("軌道艙");
	}	
}
/**
  *裝配者實現類:思路:裝配者通過構建者來構造子組件,然後在進行組裝
  */
    
public class MyAirshipDirector implements AirShipDirector {

	private AirShipBuilder builder;

	public MyAirshipDirector(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;
	}
}
public class Client {
	public static void main(String[] args) {
		
		AirShipDirector director = new MyAirshipDirector(new MyAirShipBuilder());

		AirShip ship = director.directAirShip();
		
		System.out.println(ship.getEngine().getName());
		
		ship.launch();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章