java设计模式(精通系列)-Builder模式

来源:互联网 发布:智慧树网络课程app 编辑:程序博客网 时间:2024/06/04 00:43

建造者模式:跟构造器相比,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

原创粉丝点击