设计模式之建造者模式

时间:2022-10-01 23:18:09
  1. 基本概念
    建造者模式将一个复杂对象的构建与它的表示分离,使得同样的过程可以创建不同的表示。
  2. 建造者模式内容
    建造者模式一般包含以下内容:
    AbstractBuilder:抽象接口,用于声明建造某种对象所需要的方法,需要创建哪些部分。
    ConcreteBuilder:具体建造者,实现抽象接口,具体实现创建各个部分的方法,并且提供创建完的对象实例。
    Director:调度器,用于确定建造对象时的具体步骤,指定需要创建哪些部分。
    Product:具体的产品对象,包含自己的各部分(即属性)

  3. 代码示例

/**
* Person类,具有头部,身体,四肢
* @author yjzhou
* 2016.03.19
*/

public class Person {
/**头部*/
private String head;
/**身体*/
private String body;
/**四肢*/
private String limb;

public Person() {
// TODO Auto-generated constructor stub
}

public String getHead() {
return head;
}

public void setHead(String head) {
this.head = head;
}

public String getBody() {
return body;
}

public void setBody(String body) {
this.body = body;
}

public String getLimb() {
return limb;
}

public void setLimb(String limb) {
this.limb = limb;
}

@Override
public String toString (){
return "this person head="+head
+",body="+body
+",limb="+limb;
}
}
/**
* 抽象构建器,声明构建Person对象需要的组件
* @author yjzhou
* 2016.03.19
*/

public interface AbstractBuilder {
public void buildHead();
public void buildBody();
public void buildLimb();
public Person buildPerson();
}
/***
* Man的构建器,实现抽象构建器
* @author yjzhou
* 2016.03.19
*/

public class ManBuilder implements AbstractBuilder{
/**Person类对象*/
private Person person;

public ManBuilder() {
person = new Person();
}

@Override
public void buildHead() {
person.setHead("man head");
}

@Override
public void buildBody() {
person.setBody("man body");
}

@Override
public void buildLimb() {
person.setLimb("man limb");
}

@Override
public Person buildPerson() {
return person;
}
}
/**
* 调度器,确定创造Person对象的具体步骤
* @author yjzhou
*
*/

public class Director {
/***
* 创建Person对象的具体方法和步骤
* @return person对象
*/

public Person constructPerson(AbstractBuilder builder){
builder.buildHead();
builder.buildBody();
builder.buildLimb();
Person person = builder.buildPerson();
return person;
}
}
/***
* 测试建造者模式
* @author yjzhou
*
*/

public class BuilderTest {

public static void main(String[] args) {
ManBuilder builder = new ManBuilder();
Director director = new Director();
Person person = director.constructPerson(builder);
System.out.println(person);
}

}

总结

通过以上的代码可以知道,传递给调度器对象不同的建造者,就可以得到不同的Person对象,示例中创建的事Man类型的Person,若是想要获得Women类型的Person,只需要写一个Women类型的Builder实现AbstractBuilder,传递给调度器即可,获得一个Women类型的Person对象了。提高了程序的扩展性,不必修改原有的代码。