建造者模式(Builder pattern)
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户和指导联系,指导者联系建造者最后得到产品牌。即建造模式可以强制实现一种分步骤进行的建造过程。
建造者模式将复杂的内部创建封装在内部,对于外部调用者来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心
建造者模式角色
- 抽象建造者角色(Builder):该角色用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑;
- 具体建造者角色(Concrete Builder):该角色实现抽象建造者角色中定义的所有方法,并且返回一个组件好的产品实例;
- 产品角色(Product):该角色是建造中的复杂对象,一个系统中会有多于一个的产品类,这些产品类并不一定有共同的接口,完全可以是不相关联的;
- 导演者角色:该角色负责安排已有模块的顺序,然后告诉Builder开始建造。
建造者模式的优点
- 封装性,使用建造者模式可以使客户端用户不用关心产品内部的组成细节;
- 建造者独立,容易扩展;
- 便于控制细节风险,由于具体的建造者是独立的,因此可以对建造者过程逐渐细化,而不对其他的模块产生影响。
建造者模式的使用场景
- 相同的方法,不同的执行顺序,产生不同的结果;
- 多个部件和零件,都可以装配到一个对象中,但是产生的运行结果又不同时;
- 产品类复杂,或者产品类中的方法调用顺序不同产生不同的效能;
- 在对象创建过程中会使用到系统的一些其他对象。
女娲造人例子
package buildermodel;
public class Person {
private String head;
private String body;
private String hand;
private String foot;
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 getHand() {
return hand;
}
public void setHand(String hand) {
this.hand = hand;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
public String toString(){
return "head: "+head+"\t body: "+body+"\t hand:"+hand+"\t foot: "+foot;
}
}
package buildermodel;
/**
* 建造者:女娲
*
*/
public interface Builder {
public void buildHead();
public void buildBody();
public void buildHand();
public void buildFoot();
public Person getPerson();
}
package buildermodel;
/**
* 用于制造男人的建造者
*
*/
public class MainBuilder implements Builder {
private Person person;
public MainBuilder(){
person = new Person();
buildHead();
buildBody();
buildHand();
buildFoot();
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
person.setHead("man's head");
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
person.setBody("man's body");
}
@Override
public void buildHand() {
// TODO Auto-generated method stub
person.setHand("man's hand");
}
@Override
public void buildFoot() {
// TODO Auto-generated method stub
person.setFoot("man's foot");
}
public Person getPerson(){
return person;
}
}
package buildermodel;
/**
* 用于制造女人的建造者
*
*/
public class WomanBuilder implements Builder {
private Person person;
public WomanBuilder(){
person = new Person();
buildHead();
buildBody();
buildHand();
buildFoot();
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
person.setHead("woman's head");
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
person.setBody("woman's body");
}
@Override
public void buildHand() {
// TODO Auto-generated method stub
person.setHand("woman's hand");
}
@Override
public void buildFoot() {
// TODO Auto-generated method stub
person.setFoot("woman's foot");
}
public Person getPerson(){
return person;
}
}
package buildermodel;
/**
* 导演者Director
*
*/
public class PersonDirector {
Builder builder;
public Person createPerson(String builderName){
if("main".equals(builderName)){
builder = new MainBuilder();
}else if("woman".equals(builderName)){
builder = new WomanBuilder();
}
return builder.getPerson();
}
}
package buildermodel;
public class TestBuilderModel {
public static void main(String[] args) {
// TODO Auto-generated method stub
PersonDirector director = new PersonDirector();
//创造男人
System.out.println(director.createPerson("main"));
//创造男人
System.out.println(director.createPerson("woman"));
}
}