java中23種設計模式--構造者模式(Builder)

1 定義

GOF 給建造模式的定義爲:將一個複雜對象的構建與它的表示分離,使得一樣的構建 過程能夠建立不一樣的表示。這句話說得很抽象,很差理解,其實它的意思能夠理解爲:將構 造複雜對象的過程和組成對象的部件解耦。
就像組裝的電腦同樣,無論什麼品牌的配件,只要兼 容就能夠裝上;一樣,同樣的配件,能夠有好多組裝的方式。這是對下降耦合、提升可複用 性精神的一種貫徹。設計模式

2 結構

當要生成的產品有複雜的內部結構——好比由多個對象組成;而系統中對此產品的需求 未來可能要改變產品對象的內部結構的構成,好比說產品的一些屬性如今由一個小對象組 成,而更改後的型號可能須要 N 個小對象組成;並且不能將產品的內部構造徹底暴露給客 戶程序,一是爲了可用性,二是爲了安全等因素。知足上面的設計環境就能夠考慮使用建造 模式來搭建框架了。安全

建造模式的組成:bash

  1. 抽象構造者模式--這個角色用來規範產品對象的各個組成成分的建造。通常而言,此角色獨立於應用程序的業務邏輯。
  2. 具體建造者角色--擔任這個角色的是於應用程序緊密相關的類,它們在指導者的調用下 建立產品實例。這個角色在實現抽象建造者角色提供的方法的前提下,達到完成產品組 裝,提供成品的功能.
  3. 指導者角色--調用具體建造者角色以建立產品對象。指導者並無產品類的具體知識.(也叫上下文) 真正擁有產品類的具體知識的是具體建造者對象。
  4. 產品角色--建造中的複雜對象。它要包含那些定義組件的類,包括將這些組件裝配成產 品的接口。

首先客戶程序建立一個指導者對象,一個建造者角色,並將建造者角色傳入指導者對象 進行配置。而後,指導者按照步驟調用建造者的方法建立產品。最後客戶程序從建造者或者 指導者那裏獲得產品。 從建造模式的工做流程來看,建造模式將產品的組裝「外部化」到了建造者角色中來。

3 代碼示例

這裏以一個簡單的iphone6的生產爲例
iphone實體類框架

public class Iphone6 {
	
	private Cell cell;	//電池
	private Screen screen;	//屏幕
	private Mainboard mainboard;	//主板
	
	public void open() {
		System.out.println("手機開機");
	}
	
	public Cell getCell() {
		return cell;
	}
	public void setCell(Cell cell) {
		this.cell = cell;
	}
	public Screen getScreen() {
		return screen;
	}
	public void setScreen(Screen screen) {
		this.screen = screen;
	}
	public Mainboard getMainboard() {
		return mainboard;
	}
	public void setMainboard(Mainboard mainboard) {
		this.mainboard = mainboard;
	}

}

//電池類
class Cell{
	private String name;
	public Cell(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

//電池類
class Screen{
	private String name;
	public Screen(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

//主板類
class Mainboard{
	private String name;
	public Mainboard(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
複製代碼

指導者接口iphone

//指導者
public interface Iphone6Director {
	Iphone6 dircectIphone6();
}
複製代碼

構造者接口ide

//構造者抽象類
public interface Iphone6Builder {
	//構建自組建
	Cell builderCell();
	Screen builderScreen();
	Mainboard builderMainboard();
}
複製代碼

構造者實現類--用來建立複雜對象各個組件測試

public class MyIphone6Builder implements Iphone6Builder{

	@Override
	public Cell builderCell() {
		// TODO Auto-generated method stub
		System.out.println("構建屏幕");
		//也能夠與工廠模式或單例模式相結合 
		return new Cell("iphone6的屏幕");
	}

	@Override
	public Screen builderScreen() {
		// TODO Auto-generated method stub
		System.out.println("構建電池");
		return new Screen("iphone6的電池");
	}

	@Override
	public Mainboard builderMainboard() {
		// TODO Auto-generated method stub
		System.out.println("構建主板");
		return new Mainboard("iphone6的主板");
	}
	
}
複製代碼

指導者實現類--負責安排各個組件的建造順序ui

public class MyIphone6Director implements Iphone6Director{

	private MyIphone6Builder builder;
	
	public MyIphone6Director(MyIphone6Builder builder) {
		this.builder = builder;
	}
	@Override
	public Iphone6 dircectIphone6() {
		// TODO Auto-generated method stub
		Cell cell = builder.builderCell();
		Mainboard mainboard = builder.builderMainboard();
		Screen screen = builder.builderScreen();
		//裝配成iphone6
		Iphone6 iphone6 = new Iphone6();
		iphone6.setCell(cell);
		iphone6.setMainboard(mainboard);
		iphone6.setScreen(screen);
		return iphone6;
	}
}
複製代碼

測試類this

public class TestIphone {
	public static void main(String[] args) {
		MyIphone6Director director = new MyIphone6Director(new MyIphone6Builder());
		Iphone6 iphone6 = director.dircectIphone6();
		iphone6.open();
	}
}
複製代碼

最終一臺iphone手機就被組將建造出來了:
構建屏幕
構建主板
構建電池
手機開機spa

4 構造者模式的優勢:

  1. 建造模式使得客戶不須要知道太多產品內部的細節。它將複雜對象的組建和表示方式封 裝在一個具體的建造角色中,並且由指導者來協調建造者角色來獲得具體的產品實例。
  2. 建造模式能夠對複雜產品的建立進行更加精細的控制。產品的組成是由指導者角色調用 具體建造者角色來逐步完成的,因此比起其它建立型模式能更好的反映產品的構造過程。

5 擴展:

建造模式中極可能要用到組成成品的各類組件類,對於這些類的建立能夠考慮使用工廠 方法或者原型模式來實現,在必要的時候也能夠加上單例模式來控制類實例的產生。可是要 堅持一個大前提就是要使引入的模式給你的系統帶來好處,而不是臃腫的結構。
建造模式在獲得複雜產品的時候可能要引用多個不一樣的組件,在這一點上來看,建造模 式和抽象工廠模式是類似的。能夠從如下兩點來區分二者:建立模式着重於逐步將組件裝配 成一個成品並向外提供成品,而抽象工廠模式着重於獲得產品族中相關的多個產品對象;抽 象工廠模式的應用是受限於產品族的,建造模式則不會。

還可參考:
Java設計模式之構造者模式,你真正瞭解過嗎

相關文章
相關標籤/搜索