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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值