1. 程式人生 > >設計模式7-建造者模式

設計模式7-建造者模式

建造者模式:是將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

工廠類模式提供的是建立單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來建立複合物件,所謂複合物件就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。

建造者模式通常包括下面幾個角色:

1、Builder:給出一個抽象介面,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的哪些部分的建立,並不涉及具體的物件部件的建立。

2、ConcreteBuilder:實現Builder介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。 在建造過程完成後,提供產品的例項。

3、Director:呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立。

4、Product:要建立的複雜物件。

建造者應用場景

1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。

 19元每週三 漢堡+可樂+薯條=套餐可能會發生改變。

2、JAVA 中的 StringBuilder 陣列(單個字元)字整合在一起 字串

使用場景:

1、需要生成的物件具有複雜的內部結構。

2、需要生成的物件內部屬性本身相互依賴。

與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。

實際案例

這裡以遊戲開發中人物的構造過程為例。在遊戲中建立一個形象時,需要對每個部位進行建立。簡化而言,需要建立頭部,身體和四肢。

頭部、體部、四肢

程式碼實現

Person類

public class Person {

	private String head;
	
	private String body;
	
	private String foot;

	public String getHead() {
		return head;
	}

	public void setHead(String head) {
		this.head = head;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}

	public String getFoot() {
		return foot;
	}

	public void setFoot(String foot) {
		this.foot = foot;
	}

	@Override
	public String toString() {
		return "Person [head=" + head + ", body=" + body + ", foot=" + foot + "]";
	}
	
}

PersonBuilder類

public interface PersonBuilder {

	void buildHead();
	
	void buildBody();
	
	void buildFoot();
	
	// 組裝部件
	Person buildPerson();
	
}

 ZhangSanBuilder類

public class ZhangSanBuilder implements PersonBuilder {
	
	private Person person;
	
	public ZhangSanBuilder() {
		person = new Person();
	}
	
	@Override
	public void buildHead() {
		person.setHead("zhangsan...head");
	}

	@Override
	public void buildBody() {
		person.setBody("zhangsan...body");
	}

	@Override
	public void buildFoot() {
		person.setFoot("zhangsan...foot");
	}

	public Person buildPerson() {
		return person;
	}
	
}

LisiBuilder類

public class LisiBuilder implements PersonBuilder {
	
	private Person person;
	
	public LisiBuilder() {
		person = new Person();
	}
	
	@Override
	public void buildHead() {
		person.setHead("lisi...head");
	}

	@Override
	public void buildBody() {
		person.setHead("lisi...body");
	}

	@Override
	public void buildFoot() {
		person.setHead("lisi...foot");
	}

	@Override
	public Person buildPerson() {
		return person;
	}

}

PersonDirector類

public class PersonDirector {

	public Person createPerson(PersonBuilder personBuilder) {
		personBuilder.buildHead();
		personBuilder.buildBody();
		personBuilder.buildFoot();
		return personBuilder.buildPerson();
	}
	
	
	public static void main(String[] args) {
		PersonDirector personDirector = new PersonDirector();
		Person zhangSan = personDirector.createPerson(new ZhangSanBuilder());
		System.out.println(zhangSan);
	}
	
}

結果

Person [head=zhangsan...head, body=zhangsan...body, foot=zhangsan...foot]