Java設計模式之建造者模式

一、建造者模式簡介

      建造者模式可以將產品的構建過程與表示分離,UML圖如下:

 

二、代碼實現

       在一個抽象類裏定義需要建議的東西,然後通過所有動作放在一個方法裏執行。

package com.atguigu.builder;

public abstract class AbstractHouse {
	

	public abstract void buildBasic();

	public abstract void buildWalls();
	
	public abstract void roofed();
	
	public void build() {
		buildBasic();
		buildWalls();
		roofed();
	}
	
}

實現該抽象類:

package com.atguigu.builder;

public class CommonHouse extends AbstractHouse {

	@Override
	public void buildBasic() {
		// TODO Auto-generated method stub
		System.out.println(" 建地基");
	}

	@Override
	public void buildWalls() {
		// TODO Auto-generated method stub
		System.out.println("建牆");
	}

	@Override
	public void roofed() {
		// TODO Auto-generated method stub
		System.out.println("蓋瓦");
	}

}

測試:

package com.atguigu.builder;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CommonHouse commonHouse = new CommonHouse();
		commonHouse.build();
	}

}

 

三、 改進的建造者模式

        建造者通過使用不同的builder類組裝不同的材料能夠建立出不同的產品(product),但生產的流程是一樣的。

      1. 抽象Builder工具類,主要包含製造產品的對象和詳細的製造過程,定義一個HouseBuilder類,如果需要建造不同的產品,那麼就要繼承該Builder抽象類,生成不同的Builder工具。

package com.atguigu.builder.improve;


//builder
public abstract class HouseBuilder {
	
	//構建的對象和方法過程

	protected House house = new House();

	public abstract void buildBasic();
	public abstract void buildWalls();
	public abstract void roofed();
	


	public House buildHouse() {
		return house;
	}
	
}

       

       2.  產品類,產品類主要是包含生產該產品最後的實現結果,也是使用建造者模式後生成的結果,House代碼如下:

package com.atguigu.builder.improve;


//產品
public class House {
	private String baise;
	private String wall;
	private String roofed;
	public String getBaise() {
		return baise;
	}
	public void setBaise(String baise) {
		this.baise = baise;
	}
	public String getWall() {
		return wall;
	}
	public void setWall(String wall) {
		this.wall = wall;
	}
	public String getRoofed() {
		return roofed;
	}
	public void setRoofed(String roofed) {
		this.roofed = roofed;
	}
	
}

  

    3.   建造者,建造者需要builder才能生產產品,代碼如下:

    

package com.atguigu.builder.improve;

//建造者
public class HouseDirector {
	
	HouseBuilder houseBuilder = null;

	//需要工具來建造
	public HouseDirector(HouseBuilder houseBuilder) {
		this.houseBuilder = houseBuilder;
	}

	// 提供對外初始化的builder
	public void setHouseBuilder(HouseBuilder houseBuilder) {
		this.houseBuilder = houseBuilder;
	}
	
	//返回產品
	public House constructHouse() {
		houseBuilder.buildBasic();
		houseBuilder.buildWalls();
		houseBuilder.roofed();
		return houseBuilder.buildHouse();
	}
	
	
}

 

     4.  具體的Builder類, 產品的不同實現需要不同的builder,比如我們要建一棟高樓,還要建一棟普通的房子,只不過是需要的材料不同而已。

     高樓: 

package com.atguigu.builder.improve;

//建高樓
public class HighBuilding extends HouseBuilder {

	@Override
	public void buildBasic() {
		// TODO Auto-generated method stub
		System.out.println("建造高房子的地基");
	}

	@Override
	public void buildWalls() {
		// TODO Auto-generated method stub
		System.out.println("建造高房子的牆");
	}

	@Override
	public void roofed() {
		// TODO Auto-generated method stub
		System.out.println("建造高房子的屋頂");
	}

}

  普通的房子: 

package com.atguigu.builder.improve;


//建普通的房子
public class CommonHouse extends HouseBuilder {

	@Override
	public void buildBasic() {
		// TODO Auto-generated method stub
		System.out.println("建造普通房子的地基");
	}

	@Override
	public void buildWalls() {
		// TODO Auto-generated method stub
		System.out.println("建造普通房子的牆");
	}

	@Override
	public void roofed() {
		// TODO Auto-generated method stub
		System.out.println("建造普通房子的屋頂");
	}

}

 

 5. 測試類

 

package com.atguigu.builder.improve;

public class Client {
	public static void main(String[] args) {
		
		//普通的房子
		CommonHouse commonHouse = new CommonHouse();
		
		//建造者要建普通的房子
		HouseDirector houseDirector = new HouseDirector(commonHouse);
		
		
		House house = houseDirector.constructHouse();

		
		System.out.println("--------------------------");
		//建高樓
		HighBuilding highBuilding = new HighBuilding();
		//構造高樓的builder
		houseDirector.setHouseBuilder(highBuilding);
		//使用高樓的builder建高房子
		houseDirector.constructHouse();
		
		
	}
}

 

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