参考 1设计模式之蝉
2 点击打开链接
定义:将一个复杂对象的构建与它的表示分离,使得同样的创建过程可以创建不同的表示。
角色:
Product:产品类 通常实现了模板方法模式,有模板方法和基本方法,(也可以是普通的继承关系的)。
Builder:抽象建造者 规范产品的组建,一般是由子类实现。
ConcreteBuilder:具体建造者 实现抽象类的方法,并且返回一个组建好的对象。
Director:负责安排已有模块的顺序,然后告诉builder开始构建。
优点:
1.封装性 使用建造者模式 可以使客户端不必知道 产品内部组成的细节。
2.建造者独立 容易扩展
3.便于控制细节风险 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不影响其他模块。
使用场景:
1.相同的方法,不同的执行顺序,产生不同的结果(模板方法模式),可以采用建造者模式
2.多个部件或零件,都可以装配到一个对象中,产生的运行结果不相同时,可以采用建造者模式
3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,可以采用建造者模式
与工厂模式的区别:建造者模式最主要的是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗的说是零件的装配,工厂方法重点是创建,创建零件是它的职责,组装顺序不是它关心的。
/**
*
* @author lm
*Product 产品类 产品抽象类
*/
public abstract class Mobile {
public int mColorId ;
public int mModel ;
public int mMemory;
public abstract void setColor(int ColorID);
public abstract void setModel(int model);
public abstract void setMemory(int memory);
}
</pre><pre name="code" class="java"><pre name="code" class="java">public class LaMobile extends Mobile {
public void setColor(int ColorID) {
mColorId = ColorID;
}
public void setModel(int model) {
mModel = model;
}
public void setMemory(int memory) {
mMemory = memory;
}
}
/**
* Builder抽象建造者
* @author lm
*
*/
public abstract class MobileBuilder {
public abstract void setColor(int ColorID);
public abstract void setModel(int model);
public abstract void setMemory(int memory);
public abstract Mobile createMobile();
}
/**
* 具体建造者
* @author lm
*
*/
public class LaMobileBuilder extends MobileBuilder {
LaMobile laMobile = new LaMobile();
public void setColor(int ColorID) {
laMobile.setColor(ColorID);
}
public void setModel(int model) {
laMobile.setModel(model);
}
public void setMemory(int memory) {
laMobile.setMemory(memory);
}
public Mobile createMobile() {
return laMobile;
}
}
public class Director {
MobileBuilder mBuilder ;
public Director(MobileBuilder builder){
mBuilder = builder;
}
public void construct(int colorId ,int model , int memory){
mBuilder.setColor(colorId);
mBuilder.setModel(model);
mBuilder.setMemory(memory);
}
}
public class Test {
public static void main(String args[]){
MobileBuilder builder = new LaMobileBuilder();
Director director = new Director(builder);
director.construct(0, 12, 1024);
Mobile mobile = builder.createMobile();
}
}