建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简单点讲,就是使用多个简单的对象一步一步构建成一个复杂的对象,属于创建型模式,提供了一种创建对象的最佳方式。
优点
- 建造者独立,容易扩展
- 便于控制细节风险
缺点
- 产品必须有共同点,范围有限制
- 内部变化复杂,会有很多的建造类
案例
以lol 盖伦、赵信召唤师为例,召唤师都有名称和qwer技能
package pattern;
public class Hero {
private String name;
private String qskill;
private String wskill;
private String eskill;
private String rskill;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getQskill() {
return qskill;
}
public void setQskill(String qskill) {
this.qskill = qskill;
}
public String getWskill() {
return wskill;
}
public void setWskill(String wskill) {
this.wskill = wskill;
}
public String getEskill() {
return eskill;
}
public void setEskill(String eskill) {
this.eskill = eskill;
}
public String getRskill() {
return rskill;
}
public void setRskill(String rskill) {
this.rskill = rskill;
}
@Override
public String toString() {
return "Hero [name=" + name + ", qskill=" + qskill + ", wskill=" + wskill + ", eskill=" + eskill + ", rskill="
+ rskill + "]";
}
}
package pattern;
public interface HeroBuilder {
void createName();
void createqSkill();
void createwSkill();
void createeSkill();
void createrSkill();
Hero createHero();
}
package pattern;
public class Gailun implements HeroBuilder {
private Hero hero;
@Override
public void createName() {
hero.setName("盖伦");
}
@Override
public void createqSkill() {
hero.setQskill("q:致命打击");
}
@Override
public void createwSkill() {
hero.setWskill("w:勇气");
}
@Override
public void createeSkill() {
hero.setEskill("e:审判");
}
@Override
public void createrSkill() {
hero.setRskill("r:德玛西亚正义");
}
@Override
public Hero createHero() {
return hero;
}
public Gailun() {
hero = new Hero();
}
}
package pattern;
public class Zhaoxin implements HeroBuilder {
private Hero hero;
@Override
public void createName() {
hero.setName("赵信");
}
@Override
public void createqSkill() {
hero.setQskill("q:三重爪击");
}
@Override
public void createwSkill() {
hero.setWskill("w:风斩电刺");
}
@Override
public void createeSkill() {
hero.setEskill("e:无畏冲锋");
}
@Override
public void createrSkill() {
hero.setRskill("r:新月护卫");
}
@Override
public Hero createHero() {
return hero;
}
public Zhaoxin() {
hero = new Hero();
}
}
package pattern;
public class Director {
public Hero createHero(HeroBuilder hero){
hero.createName();
hero.createeSkill();
hero.createqSkill();
hero.createwSkill();
hero.createrSkill();
return hero.createHero();
}
}
package pattern;
public class Test {
public static void main(String[] args) {
Director d= new Director();
// 创建赵信
Hero zhaoxin = d.createHero(new Zhaoxin());
System.out.println(zhaoxin.toString());
// 创建盖伦
Hero gailun = d.createHero(new Gailun());
System.out.println(gailun.toString());
}
}