建造者模式

蓋房項目需求
1) 須要建房子:這一過程爲打樁、砌牆、封頂
2) 房子有各類各樣的,好比普通房,高樓,別墅,各類房子的過程雖然同樣,可是要求不要相同的.
3) 請編寫程序,完成需求.java

傳統方式解決蓋房需求
一、分析編程

二、代碼緩存

public abstract class AbstractHouse {
	//打地基
	public abstract void buildBasic();
	//砌牆
	public abstract void buildWalls();
	//封頂
	public abstract void roofed();
	public void build() {
		buildBasic();
		buildWalls();
		roofed();
	}
}
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(" 普通房子封頂 ");
	}
}
public class Client {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CommonHouse commonHouse = new CommonHouse();
		commonHouse.build();
	}
}

傳統方式解決蓋房需求問題分析app

1) 優勢是比較好理解,簡單易操做。ide

2) 設計的程序結構,過於簡單,沒有設計緩存層對象,程序的擴展和維護很差. 也就是說,這種設計方案,把產品(即:房子) 和 建立產品的過程(即:建房子流程) 封裝在一塊兒,耦合性加強了。源碼分析

3) 解決方案:將產品和產品建造過程解耦 => 建造者模式.ui

 

建造者模式基本介紹this

基本介紹spa

1) 建造者模式(Builder Pattern) 又叫生成器模式,是一種對象構建模式。它能夠將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不一樣實現方法能夠構造出不一樣表現(屬性)的對象。(抽象出來的是建造者,以前一直以爲把產品抽象出來。後面代碼會有體現)設計

2) 建造者模式 是一步一步建立一個複雜的對象,它容許用戶只經過指定複雜對象的類型和內容就能夠構建它們,用戶不須要知道內部的具體構建細節。

 

建造者模式的四個角色

1) Product(產品角色): 一個具體的產品對象。

2) Builder(抽象建造者): 建立一個Product對象的各個部件指定的 接口/抽象類。

3) ConcreteBuilder(具體建造者): 實現接口,構建和裝配各個部件。

4) Director(指揮者): 構建一個使用Builder接口的對象。它主要是用於建立一個複雜的對象。它主要有兩個做用,一是:隔離了客戶與對象的生產過程,二是:負責控制產品對象的生產過程。

 

建造者模式原理類圖

建造者模式解決蓋房需求應用實例

1) 須要建房子:這一過程爲打樁、砌牆、封頂。不論是普通房子也好,別墅也好都須要經歷這些過程,下面咱們使用建造者模式(Builder Pattern)來完成

2) 思路分析圖解(類圖)

3) 代碼實現

//產品->Product
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;
	}
}
// 抽象的建造者
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;
	}
}
//具體的建造者1
public class HighBuilding extends HouseBuilder {
	@Override
	public void buildBasic() {
		// TODO Auto-generated method stub
		System.out.println(" 高樓的打地基100米 ");
	}
	@Override
	public void buildWalls() {
		// TODO Auto-generated method stub
		System.out.println(" 高樓的砌牆20cm ");
	}
	@Override
	public void roofed() {
		// TODO Auto-generated method stub
		System.out.println(" 高樓的透明屋頂 ");
	}
}
//具體的建造者2
public class CommonHouse extends HouseBuilder {
	@Override
	public void buildBasic() {
		// TODO Auto-generated method stub
		System.out.println(" 普通房子打地基5米 ");
	}
	@Override
	public void buildWalls() {
		// TODO Auto-generated method stub
		System.out.println(" 普通房子砌牆10cm ");
	}
	@Override
	public void roofed() {
		// TODO Auto-generated method stub
		System.out.println(" 普通房子屋頂 ");
	}
}
//指揮者,這裏去指定製做流程,返回產品
public class HouseDirector {
	HouseBuilder houseBuilder = null;
	//構造器傳入 houseBuilder
	public HouseDirector(HouseBuilder houseBuilder) {
		this.houseBuilder = houseBuilder;
	}
	//經過setter 傳入 houseBuilder
	public void setHouseBuilder(HouseBuilder houseBuilder) {
		this.houseBuilder = houseBuilder;
	}
	//如何處理建造房子的流程,交給指揮者
	public House constructHouse() {
		houseBuilder.buildBasic();
		houseBuilder.buildWalls();
		houseBuilder.roofed();
		return houseBuilder.buildHouse();
	}
}

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("輸出流程");
		System.out.println("--------------------------");
		//蓋高樓
		HighBuilding highBuilding = new HighBuilding();
		//重置建造者
		houseDirector.setHouseBuilder(highBuilding);
		//完成蓋房子,返回產品(高樓)
		houseDirector.constructHouse();	
		
	}
}

建造者模式在JDK的應用和源碼分析

1) java.lang.StringBuilder中的建造者模式

2) 代碼說明+Debug源碼

建造者模式在JDK的應用和源碼分析

3) 源碼中建造者模式角色分析

 Appendable 接口定義了多個 append 方法(抽象方法), 即 Appendable 爲抽象建造者, 定義了抽象方法

 AbstractStringBuilder 實現了 Appendable 接口方法,這裏的 AbstractStringBuilder  已是建造者,只是不能實例化

 StringBuilder 即充當了指揮者角色,同時充當了具體的建造者,建造方法的實現是由 AbstractStringBuilder 完成, 而StringBuilder 繼承了 AbstractStringBuilder

 

建造者模式的注意事項和細節

1) 客戶端(使用程序)沒必要知道產品內部組成的細節,將產品自己與產品的建立過程解耦,使得相同的建立過程能夠建立不一樣的產品對象

2) 每個具體建造者都相對獨立,而與其餘的具體建造者無關,所以能夠很方便地替換具體建造者或增長新的具體建造者, 用戶使用不一樣的具體建造者便可獲得不一樣的產品對象

3) 能夠更加精細地控制產品的建立過程 。將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰,也更方便使用程序來控制建立過程

4) 增長新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統擴展方便,符合 「開閉原則」

5) 建造者模式所建立的產品通常具備較多的共同點,其組成部分類似,若是產品之間的差別性很大,則不適合使用建造者模式,所以其使用範圍受到必定的限制。

6) 若是產品的內部變化複雜,可能會致使須要定義不少具體建造者類來實現這種變化,致使系統變得很龐大,所以在這種狀況下,要考慮是否選擇建造者模式.

7) 抽象工廠模式VS建造者模式抽象工廠模式實現對產品家族的建立,一個產品家族是這樣的一系列產品:具備不一樣分類維度的產品組合,採用抽象工廠模式不須要關心構建過程,只關心什麼產品由什麼工廠生產便可。而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是經過組裝零配件而產生一個新產品 

 

 

 

 

 

 

 

 

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息