設計模式14:建造者模式

1.建房子問題

(1) 問題
  • 建房子的過程:打樁、砌牆、封頂。
  • 建的房子有這種各樣的,比如普通房、高樓、別墅,雖然他們的過程是一樣的,但是要求各不相同。
(2) 傳統方法實現

在這裏插入圖片描述

/** 房子抽象類 **/
public abstract class AbstractHouse{
	// 打地基
	public abstract void buildBasic();
	// 砌牆
	public abstract void buildWall();
	// 封頂
	public abstract void roofed();

	// 建房子,其中具體的各個步驟的內容子類會實現。
	public void build(){
		buildBasic();
		buildWall();
		roofed();
	}
}

/** 普通房子類 **/
public class CommonHouse extends AbstractHouse{
	@Override
	public void buildBasic(){ sout("普通房子打地基中..."); }
	
	@Override
	public void buildWall(){ sout("普通房子砌牆中..."); }

	@Override
	public void roofed(){ sout("普通房子封頂中..."); }
}

/** 使用 **/
public class doBuild(){
	psvm(){
		CommonHouse common = new CommonHous();
		common.build();
	}
}
(3) 優缺點
  • 優點:簡單易操作
  • 缺點:設計的程序結構,過於簡單,沒有設計緩存層對象,程序的拓展性和維護性不好。這種設計方案,把產品(房子)和創建產品的過程(建房子)封裝在一起,耦合性增強了。
  • 將產品和產品建造的過程解耦 => 建造者模式

2.建造者模式

(1) 基本介紹
  • 建造者模式,又叫生成器模式,是一種對象構建模式。它可以將複雜對象的建造過程抽象出來,是這個抽象過程的不同實現方式可以構造出不同表現(屬性)的對象。
  • 建造者模式是一步一步創建一個複雜的對象,它允許用戶只通過指定複雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。
(2) 建造者模式的四個角色
  • Product(產品角色):一個具體的產品對象。
  • Builder(抽象建造者):創建一個Product對象的各個部件指定的接口或抽象類。主要負責描述、指定Product的建造各個步驟,但是具體的建造內部不需要實現。(注意這個角色不指定建造流程,流程由指揮者負責)
  • ConcreteBuilder(具體建造者):繼承、實現抽象建造者,具體實現建造Product的各個部件。
  • Director(指揮者):構建一個使用Builder接口/抽象類的對象。控制產品對象的生產過程。
    在這裏插入圖片描述
(3) 用建造者模式實現建房子

在這裏插入圖片描述

/** 房子類 => 產品 **/
public class House{
	private String basic;	// 地基
	private String wall;	// 牆
	private String roofed;	// 屋頂

	getter&setter();
}

/** 房子建造抽象類 => 抽象建造者 **/
public abstract class HouseBuilder{
	private House house = new House();
		
	public abstract void buildBasic();	// 打地基
	public abstract void buildWall();	// 砌牆
	public abstract void roofed();	// 封頂

	public House getResult(){
		return house;
	}
}

/** 普通房子類 => 具體建造者 **/
public class CommonHouse extends AbstractHouse{
	@Override
	public void buildBasic(){ 
		house.setBasic("地基5米");
		sout("普通房子打地基中..."); 
	}
	
	@Override
	public void buildWall(){ 
		house.setWall("牆10釐米");
		sout("普通房子砌牆中..."); 
	}

	@Override
	public void roofed(){ 
		house.setRoofed("屋頂10釐米");
		sout("普通房子封頂中..."); 
	}
}

/** 建造房子類 => 指揮者 **/
public class HouseDirector{
	private HouseBuilder houseBuilder;
	
	// 通過構造器將HouseBuilder聚合進來,通過Setter方法也行。
	public HouseDirector(HouseBuilder houseBuilder){
		this.houseBuilder = houseBuilder;
	}

	// 如何建造房子,這個流程由指揮者在這裏處理
	public House doBuild(){
		houseBuilder.houseBuilder();
		houseBuilder.buildWall();
		houseBuilder.roofed();
		
		return houseBuilder.getResult();
	}
}

// 使用
public class Do{
	psvm(){
		// 蓋普通房子
		CommonHouse commonHouse = new CommonHouse();
		// 初始化指揮者
		HouseDirector doretor = new HouseDirector(commonHouse );
		House house = doretor.doBuild();
	}
}




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