天天看點

java設計模式--建造者模式 建造者模式的優點缺點

簡介

1.指揮者(Director)直接和客戶(Client)進行需求溝通; 

2. 溝通後指揮者将客戶建立産品的需求劃分為各個部件的建造請求(Builder); 

3. 将各個部件的建造請求委派到具體的建造者(ConcreteBuilder); 

4. 各個具體建造者負責進行産品部件的建構; 

5. 最終建構成具體産品(Product)

執行個體

1.電腦城老闆(Diretor)和小成(Client)進行需求溝通(買來打遊戲?學習?看片?)

2.了解需求後,電腦城老闆将小成需要的主機劃分為各個部件(Builder)的建造請求(CPU、主機闆blabla)

3.指揮裝機人員(ConcreteBuilder)去建構元件;

4.将元件組裝起來成小成需要的電腦(Computer)

UML

java設計模式--建造者模式 建造者模式的優點缺點

代碼:

package com.sl.demo.builder;


import java.util.ArrayList;
import java.util.List;

/**
 * 電腦
 * @author pengkun
 *
 */
public class Computer {
	//電腦由小件組裝而成
	private List<String> parts=new ArrayList<>();
	
	//電腦留有插零件的接口
	public void add(String part) {
		parts.add(part);
	}
	
	//展示自己(電腦屬性)
	public void showMe() {
		for (String part : parts) {
			System.out.println("組裝了:"+part);
		}
	}

}

package com.sl.demo.builder;
/**
 * 抽象組裝人員
 * @author pengkun
 *
 */
public interface Builder {
	//主機闆
	void installMain() ;
	//cpu
	void installCPU();
	//硬碟
	void installHDD();
	//記憶體
	void installMemory();
	//組裝好傳回電腦
	Computer getComputer() ; 
}

package com.sl.demo.builder;
/**
 * 具體實作建造者
 * @author pengkun
 *
 */
public class ConcreteBuilder implements Builder {

	//持有一台待組裝的電腦
	private Computer computer=new Computer();
	
	@Override
	public void installMain() {
		computer.add("華碩主機闆");
	}

	@Override
	public void installCPU() {
		computer.add("core i8");
	}

	@Override
	public void installHDD() {
		computer.add("三星 SDD 512G");
	}

	@Override
	public void installMemory() {
		computer.add("金士頓 rd5 32G");
	}

	@Override
	public Computer getComputer() {
		return computer;
	}

}
           

指揮者:

package com.sl.demo.builder;
/**
 * 指揮者
 * @author pengkun
 *
 */
public class Director {
	//叫實際建造者開始組裝(根據需求建構,說白了組裝電腦的配置由指揮者決定)
	public void construct(Builder builder) {
		builder.installMain();
		builder.installCPU();
		builder.installHDD();
		builder.installMemory();
	}
}
           

測試:

@Test
	public void test() {
		//老闆
		Director director=new Director();
		//組裝人員
		Builder builder=new ConcreteBuilder();
		//和老闆商談,然後老闆根據需求指揮組裝人員組裝一台什麼配置的電腦
		director.construct(builder);
		//組裝人員拿來電腦
		Computer computer= builder.getComputer();
		computer.showMe();
	}
           

結果:

組裝了:華碩主機闆
組裝了:core i8
組裝了:三星 SDD 512G
組裝了:金士頓 rd5 32G
           

 建造者模式的優點

        1)封裝性:使用建造者模式可以是用戶端不必知道産品内部組成的細節。

        2)建造者獨立,容易擴充

        3)便于控制細節風險:由于具體的建造者是獨立的,是以可以對建造者過程逐漸細化,而不對其他的子產品産生任何影

缺點

        1)相同的方法,不同的執行順序,産生不同的事件結果時,可以使用建造者模式。

        2)多個部件或零件,都可以裝配到一個對象中,但是産生的運作結果又不想同時,可以使用建造者模式。

        3)産品類非常複雜,或者産品類中的調用順序不同産生了不同的效能,這時候可以使用建造者模式。

        4)在對象建立過程中會使用到系統的一些其他對象,這些對象在産品對象的建立過程中不易得到,也可以采用建造者模式封裝該對象的建立過程。這種場景隻能是一個補償的方法,因為一個對象不容易獲得,而在設計階段竟然沒有發現,而要通過設計這模式來柔化建立過程,本身設計已經出問題了。

        到這裡,我們會發現,建造者模式和工廠方法模式有點像。但是兩者有差別:建造者模式關注的是零件類型和裝配工藝(順序),而工廠模式是建立一個對象,這是最大不同的地方。