设计模式-------构建者(Builder pattem)

使用场景:

  • 当一个类超过4个构造函数,而且这些参数是可选的就考虑构造者模式。 

传统方法:  

  1. 写多个构造器来实现 
public class Computer {
     ...
    public Computer(String cpu, String ram) {
        this(cpu, ram, 0);
    }
    public Computer(String cpu, String ram, int usbCount) {
        this(cpu, ram, usbCount, "罗技键盘");
    }
    public Computer(String cpu, String ram, int usbCount, String keyboard) {
        this(cpu, ram, usbCount, keyboard, "三星显示器");
    }
    public Computer(String cpu, String ram, int usbCount, String keyboard, String display) {
        this.cpu = cpu;
        this.ram = ram;
        this.usbCount = usbCount;
        this.keyboard = keyboard;
        this.display = display;
    }
}

2.使用Javabean 模式实现

第一种主要是使用及阅读不方便。你可以想象一下,当你要调用一个类的构造函数时,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了。。。那酸爽谁用谁知道。

第二种方式在构建过程中对象的状态容易发生变化,造成错误。因为那个类中的属性是分步设置的,所以就容易出错

建造者如何实现

  1. 在User类中创建一个静态内部类Builder,然后将主类中的参数复制到Builder内部类中
  2. 在User类中创建一个private的构造器,参数类型为Builder
  3. 在Builder类中创建一个public的构造器,参数为User类必填的参数
  4. 在Builder类中创建设置函数,对User哪些参数进行赋值,返回值为Builder类型的实例
  5. 在Builder类中创建一个build()方法,在其中构建User的实例并返回。
public class User {

    private List<Trip> trips = new ArrayList<Trip>();
    private List<User> friends = new ArrayList<User>();

    private User(Builder builder) {
        this.trips = builder.trips;
        this.friends = builder.friends;
    }

    public List<User> getFriends() {
        return friends;
    }

    public void addFriend(User user) {
        friends.add(user);
    }

    public void addTrip(Trip trip) {
        trips.add(trip);
    }

    public List<Trip> trips() {
        return trips;
    }

    public boolean isFriend(User loggedUser) {
        return getFriends().stream().anyMatch(friend -> friend.equals(loggedUser));
    }

    public static class Builder{
        private List<Trip> trips = new ArrayList<Trip>();
        private List<User> friends = new ArrayList<User>();
        
        //为了项目方便,改写成的这个形式来替代构造器
        public Builder aUser() {
            this.trips = new ArrayList<>();
            this.friends = new ArrayList<>();
            return this;
        }
        //原来的构造器
        public Builder(List<Trip> trips,List<User> friends) {
            this.trips = trips;
            this.friends = friends;
        }
        public Builder writeFriends(User... friends){
            this.friends = Arrays.asList(friends);
            return this;
        }
        public Builder writeTrips(Trip ... trips){
            this.trips = Arrays.asList(trips);
            return this;
        }
        public User build(){
            return new User(this);
        }
    }
}

 如何使用:

        User user = new User.Builder()
                .aUser()
                .writeFriends()
                .writeTrips()
                .build();

使用静态内部类的原因:

如果不使用静态的话:

需要new两个空间内存,浪费空间

/**
 * 使用p普通内部类 创建Builder
 * @param args
 */
public static void main(String[] args) {
    Course.CourseBuilder courseBuilder = new Course().new CourseBuilder();
    Course course = courseBuilder.build();
    System.out.println();
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值