博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之建造者模式(Builder)
阅读量:4097 次
发布时间:2019-05-25

本文共 3264 字,大约阅读时间需要 10 分钟。

啥叫建造者模式?

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

举个例子:假如你要生产一台计算机(假设你有能力生产所有部件),那你得先搞个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来调节一下:

这里写图片描述

参考文献:

你可能感兴趣的文章
正则匹配函数
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
聊聊gcc参数中的-I, -L和-l
查看>>
[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux select TCP并发服务器与客户端编程
查看>>
Linux系统编程——线程池
查看>>
基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
查看>>
Linux 线程信号量同步
查看>>
C++静态成员函数访问非静态成员的几种方法
查看>>
类中的静态成员函数访问非静态成员变量
查看>>
C++学习之普通函数指针与成员函数指针
查看>>
C++的静态成员函数指针
查看>>
Linux系统编程——线程池
查看>>
yfan.qiu linux硬链接与软链接
查看>>
Linux C++线程池实例
查看>>
shared_ptr简介以及常见问题
查看>>
c++11 你需要知道这些就够了
查看>>
c++11 你需要知道这些就够了
查看>>