设计模式之建造者模式(Builder)

啥叫建造者模式?

就是说需要搞的这个玩意儿比较复杂,您要是一趟车就要搞定,貌似难度比较大。那咋办,你得像建大楼一样,一层层往上盖才行。或者说你得先从小零件搞起,然后慢慢组装,最后成为成品。

举个例子:假如你要生产一台计算机(假设你有能力生产所有部件),那你得先搞个CPU吧,然后再得搞个主板吧(主板上你得搞这种芯片吧),然后你觉得显示效果不爽,你还得搞个显卡吧,然后电源啦,硬盘啦,机箱啦,显示器啦等等等等,折腾了这么多,你搞出一台计算机来。

再比如某机构要登记信息系统的用户信息,一个用户,首先有姓名,年龄,电话,地址,身份证号码,然后名族,是否已婚,学历,家里几口人,种了几亩田,名下有几套房产…吧啦吧啦…等等相关信息,组装起来就是用户。

拼装好了,最后“啪”贴个封条(就是Build方法),就可以出货啦!

貌似看出点意思了,一句话,拼装呗!这时候建造者模式的作用就来了,下面就是代码示例:

package com.creational.builder;

public class User 
{
    //All final attributes
    private final String firstName; // required
    private final String lastName; // required
    private final int age; // optional
    private final String phone; // optional
    private final String address; // optional

    private User(UserBuilder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    //All getter, and NO setter to provde immutability
    public String getFirstName() {
        return firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public int getAge() {
        return age;
    }
    public String getPhone() {
        return phone;
    }
    public String getAddress() {
        return address;
    }

    @Override
    public String toString() {
        return "User: "+this.firstName+", "+this.lastName+", "+this.age+", "+this.phone+", "+this.address;
    }

    public static class UserBuilder 
    {
        private final String firstName;
        private final String lastName;
        private int age;
        private String phone;
        private String address;

        public UserBuilder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }
        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }
        public UserBuilder address(String address) {
            this.address = address;
            return this;
        }
        //Return the finally consrcuted User object
        public User build() {
            User user =  new User(this);
            validateUserObject(user);
            return user;
        }
        private void validateUserObject(User user) {
            //Do some basic validations to check 
            //if user object does not break any assumption of system

            /*if(user.age <= 0){
                throw new IllegalArgumentException();
            }*/
        }
    }
}
package com.creational.builder;

public class TestUserBuilder {
    public static void main(String[] args) {
        User user1 = new User.UserBuilder("Lokesh", "Gupta")
        .age(30)
        .phone("1234567")
        .address("Fake address 1234")
        .build();

        System.out.println(user1);

        User user2 = new User.UserBuilder("Jack", "Reacher")
        .age(40)
        .phone("5655")
        //no address
        .build();

        System.out.println(user2);

        User user3 = new User.UserBuilder("Super", "Man")
        //No age
        //No phone
        //no address
        .build();

        System.out.println(user3);
    }

}

以上代码很好懂,就不用多解释了,最后还是来张建造者的UML来调节一下:

这里写图片描述

参考文献:
https://github.com/ncsbalaji/DesignPaterns
http://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html#_Toc281750449

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值