建造者模式就是把复杂的内部创建封装起来,对于外部调用的人来说只用传入建造者和建造工具,就能得到产品来!
举个例子:
邻居王大娘给王大爷一个鱼竿,他晚上给提几条鱼回来!至于老头子是怎么钓上来的,王大娘不用管!
举个创建游戏角色的代码例:
先写一个角色的结构类模型
public class GameRole {
private int powerValue;
private int sex;
private String name;
public int getPowerValue() {
return powerValue;
}
public void setPowerValue(int powerValue) {
this.powerValue = powerValue;
}
public int getSex() {
return sex;
}
public void setSex(int sex){
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
角色包含名字,战斗力和性别 ,这个相当于王大爷要去钓得的鱼的属性
再写一个建造工具部分的接口
public interface RoleBuilder {
void buildPowerValue();
void buildSex();
void buildName();
GameRole buildGameRole();
}
这个定义了钓鱼必须要做的几个部分,比如一定要在河边 一定要挂鱼饵 等,河边 鱼饵等等就是实用工具的一个部分
如果要钓鲤鱼必须在某个水域,必须使用某个鱼饵
下面实现RoleBuilder 的接口
我这里是要建造一个武士角色的建造工具
public class WarriorRoleBuilder implements RoleBuilder {
GameRole mGameRole;
public WarriorRoleBuilder() {
mGameRole = new GameRole();
}
@Override
public void buildPowerValue() {
// TODO Auto-generated method stub
mGameRole.setPowerValue(10000);
}
@Override
public void buildSex() {
// TODO Auto-generated method stub
mGameRole.setSex(1);
}
@Override
public void buildName() {
// TODO Auto-generated method stub
mGameRole.setName("夕阳武士");
}
@Override
public GameRole buildGameRole() {
// TODO Auto-generated method stub
return mGameRole;
}
}
这一个很重要,武士,法师,弓箭手所有的属性都一样,只是属性值有不同,所以在建造工具不一样
下面就是构建过程了
public class RoleDirector {
public GameRole constructGameRole(RoleBuilder rb) {
rb.buildSex();
rb.buildPowerValue();
rb.buildName();
return rb.buildGameRole();
}
}
将RoleBuilder 构建过程一步步执行,最后返回一个产品的对象!
测试代码:
public static void main(String[] args) {
RoleDirector rd = new RoleDirector();
GameRole mGameRole = rd.constructGameRole(new WarriorRoleBuilder());
}
便拿到一个武士属性的角色(mGameRole )
这个跟工厂模式有点像,但完全不一样!
如果是工厂模式的话:
会写一个武士的类,魔法师的类,弓箭手的类,去继承GameRole ,然后在工厂里面会根据不同的传入属性获得不同的角色!
而这个建造者模式,更看重建造工具:
把建造工具抽象出来,根据角色的不同属性,写不同的建造工具类,最后在构造的时候,填入工具就得到所有的角色。
据说JavaMail用的就是建造者模式,没看过代码不敢肯定!