当前位置: 首页 > news >正文

设计模式系列(图文解析,附带源码) - 生成器

5. 生成器(Builder)

Intent

封装一个对象的构造过程,并允许按步骤构造。

Class Diagram


Implementation

以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。

public class AbstractStringBuilder {
    protected char[] value;

    protected int count;

    public AbstractStringBuilder(int capacity) {
        count = 0;
        value = new char[capacity];
    }

    public AbstractStringBuilder append(char c) {
        ensureCapacityInternal(count + 1);
        value[count++] = c;
        return this;
    }

    private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        if (minimumCapacity - value.length > 0)
            expandCapacity(minimumCapacity);
    }

    void expandCapacity(int minimumCapacity) {
        int newCapacity = value.length * 2 + 2;
        if (newCapacity - minimumCapacity < 0)
            newCapacity = minimumCapacity;
        if (newCapacity < 0) {
            if (minimumCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        value = Arrays.copyOf(value, newCapacity);
    }
}
public class StringBuilder extends AbstractStringBuilder {
    public StringBuilder() {
        super(16);
    }

    @Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
}
public class Client {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        final int count = 26;
        for (int i = 0; i < count; i++) {
            sb.append((char) ('a' + i));
        }
        System.out.println(sb.toString());
    }
}
abcdefghijklmnopqrstuvwxyz

JDK

  • java.lang.StringBuilder
  • java.nio.ByteBuffer
  • java.lang.StringBuffer
  • java.lang.Appendable
  • Apache Camel builders

相关文章:

  • 设计模式系列(图文解析,附带源码) - 适配器
  • 一文搞定设计模式!五万字超详细解析!带着耐心点进来!
  • 一个系列搞定MyBatis:MyBatis配置动态SQL语句基础
  • 一个系列搞定MyBatis:MyBatis快速上手增删改查
  • 一个系列搞定MyBatis:Mybatis多表查询
  • PropertyPlaceholderConfigurer 用法超详细解析!
  • JavaFX之WebView超详细解析!
  • javafx之webEngine超详细解析
  • mybatis-plus进阶教程!超详细使用方法解析!
  • mybatis-plus入门教程!看完必懂!超详细解析!
  • Mybatis-Plus中的代码生成器AutoGenerator超详细解析!完整配置!
  • Mybatis plus关闭驼峰命名,防止出现查询为Null!四种方法超详细解析!
  • Spring体系结构超详细解析!
  • 自然语言处理系列之: NLP基础
  • 自然语言处理系列之:中文分词技术
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【刷算法】求1+2+3+...+n
  • es6(二):字符串的扩展
  • hadoop集群管理系统搭建规划说明
  • HTTP 简介
  • HTTP那些事
  • JS函数式编程 数组部分风格 ES6版
  • maven工程打包jar以及java jar命令的classpath使用
  • Promise初体验
  • 开发基于以太坊智能合约的DApp
  • 七牛云假注销小指南
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 达梦数据库知识点
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #QT(智能家居界面-界面切换)
  • ()、[]、{}、(())、[[]]命令替换
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (第61天)多租户架构(CDB/PDB)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)计算机毕业设计大学生兼职系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (简单) HDU 2612 Find a way,BFS。
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转) 深度模型优化性能 调参
  • (转)大型网站架构演变和知识体系
  • (转)关于多人操作数据的处理策略
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .Net各种迷惑命名解释
  • .NET关于 跳过SSL中遇到的问题
  • .NET运行机制
  • [ACM] hdu 1201 18岁生日
  • [Android]竖直滑动选择器WheelView的实现
  • [BZOJ4010]菜肴制作
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符