概念及定义:
建造者模式(Builder Pattern)是一种创建型设计模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简单的说就是将构造复杂对象的过程和组成对象的部件解耦。
模式的使用场景
1:相同的方法,不同的执行顺序,产生不同的事件结果时;
2:多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
3:产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;
下面我就以一个例子用代码来解释
假设莫公司要购买一批电脑,当然准备组装机。组装需要哪些部件,这个首先要想好,而又可以购买不同品牌的部件。比如联想,戴尔。
作为一个出色的开发人员,我们设计的购买系统应该包含以下功能和特性
1:多有的电脑属性应该一致;
2:随时可以增加新的品牌的电脑
3:对某个具体品牌的电脑修改不影响其他品牌。
4:因为电脑的创建过程可能很复杂,多以电脑的生成细节不应该对外暴露。
具体实现:
Builder:抽象建造者(Builder)
ConcreteBuilder:具体建造者(LenovoBuilder、DaleBuilder)
Director:指挥者(Director)
Product:产品角色(Product)
这里我们就只创建两个品牌的电脑,联想和戴尔,假设他们都有设置键盘、主机这些方法。
Prouct:
public class Product {
//code1
private String keyBoard;//键盘
private String mouse; //鼠标
private String display;//显示器
private String mainEngine; //主机
public String getKeyBoard() {
return keyBoard;
}
public void setKeyBoard(String keyBoard) {
this.keyBoard = keyBoard;
}
public String getMouse() {
return mouse;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public String getMainEngine() {
return mainEngine;
}
public void setMainEngine(String mainEngine) {
this.mainEngine = mainEngine;
}
}
抽象构建者:Builter
public abstract class Builder {
//code2 抽象构造者
protected Product product=new Product();
public abstract void bulidKeyBoard();
public abstract void bulidMouse();
public abstract void bulidDisplay();
public abstract void bulidmainEngine();
public Product result(){
return product;
}
}
具体构建者:
public class DaleBuilter extends Builder{
//具体构造者
private Product product=new Product();
@Override
public void bulidKeyBoard() {
product.setKeyBoard("戴尔 键盘");
}
@Override
public void bulidMouse() {
product.setMouse("戴尔 鼠标");
}
@Override
public void bulidDisplay() {
product.setDisplay(" 显示器");
}
@Override
public void bulidmainEngine() {
product.setMainEngine("戴尔 主机");
}
@Override
public Product result(){
return product;
}
}
public class LenovoBuilter extends Builder{
//具体构造者
private Product product=new Product();
@Override
public void bulidKeyBoard() {
product.setKeyBoard("联想 键盘");
}
@Override
public void bulidMouse() {
product.setMouse("联想 鼠标");
}
@Override
public void bulidDisplay() {
product.setDisplay(" 显示器");
}
@Override
public void bulidmainEngine() {
product.setMainEngine("联想 主机");
}
@Override
public Product result(){
return product;
}
}
指挥者:
public class Director {
//指挥者
public void construct(Builder builder){
builder.bulidDisplay();
builder.bulidKeyBoard();
builder.bulidKeyBoard();
builder.bulidmainEngine();
}
}
测试:
public class Test {
public static void main(String[] args) {
Director director=new Director();
LenovoBuilter lenovoBuilter=new LenovoBuilter();
director.construct(lenovoBuilter);
Product lenovoProduct=lenovoBuilter.result();
System.out.println(lenovoProduct);
}
}
由于建造产品的过程比较复杂,其中还有相互依赖关系(如键盘依赖主机),所以我们使用建造者模式将将建造复杂对象的过程和组成对象的部件解耦。这样既保证了基本属性全都一致(这里的一致指的是该包含的应该全都包含)也封装了其中的具体实现细节。如果需要新增一个品牌,只需要加一个具体建造者,并在该建造者中写好具体建造代码就行了。
优点:
1:良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节;
2建造者独立,容易扩展;
3:在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
缺点:
1会产生多余的Builder对象以及Director对象,消耗内存;
2对象的构建过程暴露。
3:建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
总结:
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在建造者模式的结构中引入了一个指挥者类,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。
参考资料:
Java设计模式