一个产品有不同的组成部分,而在程序里面需要把一个产品抽检出来需要较多的零件进行处理和组装,使得构造一个产品变得非常复杂,构造模式就是使得客户在不需要知道这么多复杂的细节,不必关心产品内部细节。
首先看下构造这的类图
从这个图可以看出构造模式有四个模块:
- Director(导演角色),调用具体构造者创建产品对象,他是负责从客户端传来指令交给具体干活的类。
- Builder (抽象建造者),没有具体的业务意义,就是抽象出具体构造者的方法,简单说就是为了多态。
- ConcreteBuilder(具体构造者),苦力,实打实的把零件造好,组装好
- Product(抽象产品),这里仅仅是一个抽象产品,具体业务也行更加复杂
- ProductXXX(具体产品),对抽象产品的实现
具体的情况也许并非如上图所示,如果确定系统开发过程中只有一个产品,那么没有必要分成这么多抽象,Builder 转化为一个具体构造者,直接引入 Product 进行处理也是可以的。
接下来还是来点代码看看具体构造者模式是怎么玩的。
public abstract class Product{
//提供公共部分
}
public class ProductOne extends Product{
//具体第一个产品相关属性方法
}
public class ProductOne extends Product{
//具体第二个产品相关属性方法
}
上面把产品类进行了设定,可以在抽象产品中实现一些共用的,再声明一些抽象方法迫使子类必须实现。接下看下 Builder 这块。
public interface Builder{
public void buildOne();
public void buildTwo();
public Product retrievePro();
}
publc class ConcreteBuilderOne implements Builder{
private Product product=new ProductOne();
public void buildOne(){
//打造第一个零件
}
public void buildTwo(){
//打造第二个零件
}
public Product retrievePro(){
//组装出产品2
return product;
}
}
publc class ConcreteBuilderTwo implements Builder{
private Product product=new ProductTwo();
public void buildOne(){
//打造第一个零件
}
public void buildTwo(){
//打造第二个零件
}
public Product retrievePro(){
//组装出产品2
return product;
}
}
最终导演出来进行组织下具体产品,给客户端提供友好接口
public class Director{
private Builder builder;
//这里可以结合工厂模式
public void construct(String type){
if("one".equals(type)){
builder=new ConcreteBuilderOne()
builder.buildOne();
builder.buildTwo();
builder.retrievePro();
}else if("two".equals(type)){
builder=new ConcreteBuilderTwo()
builder.buildOne();
builder.buildTwo();
builder.retrievePro();
}else{
}
}
}
上述也许过于公式化,举个例子,有个人,姑且叫他东郭先生(还没有遇到狼)吧,他要盖房子,于是他找了张三打地基,李四砌墙,王五铺瓦,最终东郭先生就盖好了房子,图例来表示如下
东郭先生就是一个导演的角色,而张三李四王五就是具体的构造者角色,东郭将盖房子这个事分别交给他们三个来完成,最后自己放个炮仗就说自己盖好房子了。
构造者模式是在构造比较复杂对象,并且该对象可以拆分多个,每个拆分也是个对象或组成部分。可以对各个步骤进行依赖,也就是分步骤进行,如盖房子,先打地基,然后砌墙,最后铺瓦,这个顺序不可错(导演的功能),因此在一个属性在被赋值之前必须把另外一个属性也要赋值这样的情况,用构造者很好使。
网友评论