建造者模式主要針對創建一個組成結構複雜對象,其創建算法獨立於結構以及其組成。
比如,我們要創建一個產品Productor,這個產品有3部分組成(有可能更多...)
package com.zndroid.dm.BuilderModel;
import java.util.ArrayList;
import java.util.List;
/**
* Created by luzhenyu on 2016/9/26.
*/
public class Productor {
List<String> parts = new ArrayList<String>();
public void addPart(String part){
parts.add(part);
}
public void showProductPart(){
for (String e : parts) {
System.out.println(e);
}
}
}
我們可以定義一個抽象類/接口來定義(IBuilder)這個產品的構建部分
package com.zndroid.dm.BuilderModel;
/**
* Created by luzhenyu on 2016/9/26.
*/
public interface IBuilder {
void buildPartA();
void buildPartB();
void buildPartC();
Productor getProductor();
}
下面創建具體產品的實現
package com.zndroid.dm.BuilderModel.impl;
import com.zndroid.dm.BuilderModel.IBuilder;
import com.zndroid.dm.BuilderModel.Productor;
/**
* Created by luzhenyu on 2016/9/26.
*/
public class BuildProductorA implements IBuilder {
private Productor A = new Productor();
@Override
public void buildPartA() {
A.addPart("產品A建造A部分");
}
@Override
public void buildPartB() {
A.addPart("產品A建造B部分");
}
@Override
public void buildPartC() {
A.addPart("產品A建造C部分");
}
@Override
public Productor getProductor() {
return A;
}
}
package com.zndroid.dm.BuilderModel.impl;
import com.zndroid.dm.BuilderModel.IBuilder;
import com.zndroid.dm.BuilderModel.Productor;
/**
* Created by luzhenyu on 2016/9/26.
*/
public class BuildProductorB implements IBuilder {
private Productor B = new Productor();
@Override
public void buildPartA() {
B.addPart("產品B建造A部分");
}
@Override
public void buildPartB() {
B.addPart("產品B建造B部分");
}
@Override
public void buildPartC() {
B.addPart("產品B建造C部分");
}
@Override
public Productor getProductor() {
return B;
}
}
如此,我們就可以創建出複雜的產品Productor了,Productor定義了產品屬性,IBuilder定義了產品的組建部分,還缺少一個指揮者引導客戶端去建造具體的產品以及產品改如何組建,所以我們創建個指揮者:
package com.zndroid.dm.BuilderModel;
/**
* Created by luzhenyu on 2016/9/26.
*/
public class Director {
private IBuilder builder;
public Director(IBuilder builder) {
this.builder = builder;
}
public void createProductor(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
public void show(){
builder.getProductor().showProductPart();
}
}
該指揮者去指揮改產品應該怎麼構建。
客戶端使用:
log("----------------我是分割線-----------------");
BuildProductorA buildProductorA = new BuildProductorA();//創建建造者
Director directorA = new Director(buildProductorA);//創建指揮者
directorA.createProductor();//用戶無需關心創建過程
directorA.show();
BuildProductorB buildProductorB = new BuildProductorB();
Director directorB = new Director(buildProductorB);
directorB.createProductor();//用戶無需關心創建過程
directorB.show();
【歡迎上碼】
【微信公衆號搜索 h2o2s2】