先来引入一个情景:一个餐厅制作不同种类的汉堡包,这些汉堡包有由面包,肉,蔬菜,调料组成,每个汉堡的这些食材各不相同,有些制作顺序也有不同。但是当我们点餐时,我们不必关心这些汉堡的制作过程,我们只需告诉前台服务员要什么汉堡就可以。
以上这个情景描述了一个建造者模式!建造者模式的作用就是:用户不必了解自己所要的对象的创建细节,便能创建并获得该对象。
一图胜千言,先上类图!
Director------------------>指挥者
Builder------------------->抽象建造者,一般有多个,对应不同的产品
ConcreteBuilder------->具体建造者
Product------------------->产品
plus:由三个类之间的关系就可以看出,用户通过向Director发送消息(传入builder对象)来创建产品。
下面上一段代码:
//演员类
public class Actor {
private String type;
private String sex;
private String face;
private String costume;
private String hairstyle;
public void setType(String type)
{
this.type=type;
}
public void setSex(String sex)
{
this.sex=sex;
}
public void setFace(String face)
{
this.face=face;
}
public void setCostume(String costume)
{
this.costume=costume;
}
public void setHairstyle(String hairstytle)
{
this.hairstyle=hairstytle;
}
public String getType()
{
return this.type;
}
public String getSex()
{
return this.sex;
}
public String getFace()
{
return this.face;
}
public String getCostume()
{
return this.costume;
}
public String getHairstyle()
{
return this.hairstyle;
}
}
abstract class ActorBuilder//抽象建造者类!!!!!
{
protected Actor actor=new Actor();
public abstract void buildType();
public abstract void buildSex();
public abstract void buildFace();
public abstract void buildCostume();
public abstract void buildHairstyle();
public Actor createActor()
{
return actor;
}
}
class HeroBuilder extends ActorBuilder//具体建造者类
{
public void buildType()
{
actor.setType("英雄");
}
public void buildSex()
{
actor.setSex("男");
}
public void buildFace()
{
actor.setFace("英俊");
}
public void buildCostume()
{
actor.setCostume("盔甲");
}
public void buildHairstyle()
{
actor.setHairstyle("飘逸");
}
}
class AngelBuilder extends ActorBuilder//具体建造者类
{
public void buildType()
{
actor.setType("天使");
}
public void buildSex()
{
actor.setSex("女");
}
public void buildFace()
{
actor.setFace("漂亮");
}
public void buildCostume()
{
actor.setCostume("白裙");
}
public void buildHairstyle()
{
actor.setHairstyle("长发");
}
}
class GhostBuilder extends ActorBuilder//具体建造者类
{
public void buildType()
{
actor.setType("魔鬼");
}
public void buildSex()
{
actor.setSex("妖");
}
public void buildFace()
{
actor.setFace("丑陋");
}
public void buildCostume()
{
actor.setCostume("黑衣");
}
public void buildHairstyle()
{
actor.setHairstyle("光头");
}
}
class ActorController//指挥者!!!用于构建实现一个Builder借口对象
{
public Actor construct(ActorBuilder ab)//参数为父类类型
{
Actor actor;
ab.buildType();
ab.buildSex();
ab.buildFace();
ab.buildCostume();
ab.buildHairstyle();
actor=ab.createActor();
return actor;
}
}
class Clicent
{
public static void main(String args[])
{
ActorController actorcontroller;
actorcontroller=new ActorController();
ActorBuilder herobuilder;
herobuilder=new HeroBuilder();
Actor hero;
hero=actorcontroller.construct(herobuilder);
String type=hero.getType();
System.out.println(type+"的外观");
System.out.println(""+hero.getCostume());
System.out.println(""+hero.getFace());
System.out.println(""+hero.getHairstyle());
System.out.println(""+hero.getSex());
}
}
这里Actor类对相应产品类,ActorBuilder和其他几个Builder分别对应抽象Builder和具体Builder。可以看出每个具体Builder都有自己独特的实现。
还可以看出,Builder包含一个Actor对象,所以很明显actor对象是由Builder直接操作的,但是这些操作的调用是在ActorController(即:Director类)中完成的。
通过传递Builder对象给Director对象就可以创建相应的产品。