建造者模式:跟构造器相比,builder模式更加的灵活
假如一个英雄有如下属性
private final Profession profession;
private final String name;
private final HairType hairType;
private final HairColor hairColor;
private final Armor armor;
private final Weapon weapon;
如果用构造器模式构造会很麻烦(因为有些英雄没有武器,或者没有一些属性,这样你要把这些特殊情况一一构造就显得多余)
而如果构造器里面再加个构造器,把自己想要的属性setter进去,就会方便很多,这就是我们的建造者模式
public class App {
public static void main(String[] args) {
Hero mage=new Hero.Builder(Profession.MAGE,"法师").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build();
System.out.println(mage.toString());
Hero warrior =
new Hero.Builder(Profession.WARRIOR, "战士").withHairColor(HairColor.BLOND)
.withHairType(HairType.LONG_CURLY).withArmor(Armor.CHAIN_MAIL).withWeapon(Weapon.SWORD)
.build();
System.out.println(warrior.toString());
}
}
/**
* Created by gmy on 2017/10/11.
*/
public class Hero {
private final Profession profession;
private final String name;
private final HairType hairType;
private final HairColor hairColor;
private final Armor armor;
private final Weapon weapon;
private Hero(Builder builder){
this.profession=builder.profession;
this.name=builder.name;
this.hairType=builder.hairType;
this.hairColor=builder.hairColor;
this.armor=builder.armor;
this.weapon=builder.weapon;
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("This is a ")
.append(profession)
.append(" named ")
.append(name);
if(hairColor!=null||hairType!=null){
sb.append(" with ");
if(hairColor!=null){
sb.append(hairColor).append(' ');
}
if(hairType!=null){
sb.append(hairType).append(' ');
}
sb.append(hairType!=HairType.BALD ? "hair":"head");//如果是光头则为head
}
if (armor!=null){
sb.append(" wearing ").append(armor);
}
if(weapon!=null){
sb.append(" and wielding a ").append(weapon);
}
sb.append('.');
return sb.toString();
}
public Profession getProfession() {
return profession;
}
public String getName() {
return name;
}
public HairType getHairType() {
return hairType;
}
public HairColor getHairColor() {
return hairColor;
}
public Armor getArmor() {
return armor;
}
public Weapon getWeapon() {
return weapon;
}
public static class Builder{
private final Profession profession;
private final String name;
private HairType hairType;
private HairColor hairColor;
private Armor armor;
private Weapon weapon;
public Builder(Profession profession,String name){//此处为必须的一些参数
if(profession==null||name==null){
throw new IllegalArgumentException("profession and name is null");
}
this.profession=profession;
this.name=name;
}
public Builder withHairType(HairType hairType){
this.hairType=hairType;
return this;
}
public Builder withHairColor(HairColor hairColor){
this.hairColor=hairColor;
return this;
}
public Builder withArmor(Armor armor){
this.armor=armor;
return this;
}
public Builder withWeapon(Weapon weapon){
this.weapon=weapon;
return this;
}
public Hero build(){
return new Hero(this);
}
}
}
public enum Armor {
CLOTHES("clothes"), LEATHER("leather"), CHAIN_MAIL("chain mail"), PLATE_MAIL("plate mail");
private String title;
Armor(String title){
this.title=title;
}
@Override
public String toString() {
return title;
}
}
public enum HairColor {
WHITE, BLOND, RED, BROWN, BLACK;
@Override
public String toString() {
return name().toLowerCase();
}
}
public enum HairType {
BALD("bald"), SHORT("short"), CURLY("curly"), LONG_STRAIGHT("long straight"), LONG_CURLY(
"long curly");
private String title;
HairType(String title) {
this.title = title;
}
@Override
public String toString() {
return title;
}
}
public enum Profession {
WARRIOR, THIEF, MAGE, PRIEST;
@Override
public String toString() {
return name().toLowerCase();
}
}
public enum Weapon {
DAGGER, SWORD, AXE, WARHAMMER, BOW;
@Override
public String toString() {
return name().toLowerCase();
}
}
Builder模式本质就是在构造器里面再添个构造器叫做Builder