建造者模式主要针对创建一个组成结构复杂对象,其创建算法独立于结构以及其组成。
比如,我们要创建一个产品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】