`
丶西红柿丿炒蛋
  • 浏览: 5551 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

建造者模式

 
阅读更多

建造者模式

定义:

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

组成:

  • 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
  • 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
  • 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
  • 导演类:负责调用适当的建造者来组建产品,规范构建流程,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

看定义:

  • “对象的构建和表示分离”:构建就是setter,表示就是getter。所以,我们在构建对象属性的时候,不是直接通过这个对象的setter去构建它。那怎么构建呢,通过他人之手帮我们构建后,返回给我们结果就好啦。所以这里肯定要有一个代理,这个代理帮我们完成setter操作。
  • “同样的构建过程”:“构建过程”就是创建对象的过程啦,因为所有的构建过程相同,所以我们肯定要有一个抽象的数据类型,这个类型描述了对象的构建过程,这不就是说我们要有一个接口,这个接口定义了构建过程的方法嘛。
  • “不同的表示”:getter出来的东西是不一样的,getter出来的是对象属性,而属性值只要不改变,getter出来的东西就不会改变,所以,这里的不同指的是对象的不同而不是对象属性值的不同。

看组成:

产品类:这无疑就是我们要的最终结果了。

抽象建造者:这个就是上面说的要有一个抽象的数据结构,这个结构描述了对象的构建过程。

建造者:就是抽象数据结构的实现类了。这就是那个帮我们完成setter操作的代理了。

导演类:规范构建流程。

 

 

 产品类Product:

public class Product {
  /**
* 定义一些关于产品的操作
*/
private String part1;
private String part2;
public String getPart1() {
return part1;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public String getPart2() {
return part2;
}
public void setPart2(String part2) {
this.part2 = part2;
} } 

抽象建造者类Builder:

public interface Builder {
public void buildPart1();
public void buildPart2();
public Product retrieveResult();
}

具体建造者类ConcreteBuilder:

public class ConcreteBuilder implements Builder {

private Product product = new Product();
/**
* 产品零件建造方法1
*/
@Override
public void buildPart1() {
//构建产品的第一个零件
    product.setPart1("编号:9527");
}
/**
* 产品零件建造方法2
*/
@Override
public void buildPart2() {
//构建产品的第二个零件
    product.setPart2("名称:XXX");
}
/**
* 产品返还方法
*/
@Override
public Product retrieveResult() {
return product;
}
}

 导演者类Director:

public class Director {
/**
* 持有当前需要使用的建造器对象
*/
private Builder builder;
/**
* 构造方法,传入建造器对象
*
@param builder 建造器对象
*/
public Director(Builder builder){
this.builder = builder;
}
/**
* 产品构造方法,负责调用各个零件建造方法
*/
public void construct(){
builder.buildPart1();
builder.buildPart2();
}
}

 客户端类Client:

public class Client {
public static void main(String[]args){
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Product product = builder.retrieveResult();
System.out.println(product.getPart1());
System.out.println(product.getPart2());
}
}

 

 

 

 

 参考:

http://www.cnblogs.com/java-my-life/archive/2012/04/07/2433939.html

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics