StringBuilder与建造者模式

StringBuilder与建造者模式

在刚学完建造者模式的时候,突然想到有StringBuilder这个东西。StringBuilder是建造者,String是产品,问题来了:指挥者在哪?StringBuilder是建造者模式吗?

首先给个结论:StringBuilder符合建造者模式的思想,但与传统的建造者模式略有不同。

分析

关于建造者模式的思想,就是将创建过程与表现分离,也就是将创建过程抽象出来。

为什么将产品(String)与建造过程(StringBuider)分离?

对于String来说,它提供的操作应该是对于字符串本身的一些操作,而不是创建或改变一个字符串。

可能有人会说,那非要这样说,要构造方法干嘛?这个问题应该这样考虑,对于一个复杂的对象来说,使用构造方法只是创建一个“外壳”,需要其它的操作来往壳子里填东西。

而对于StringBuilder来说,它种注重的就是建造的过程,比如果append(),insert()方法。

对比String与StringBuilder的提供的方法,可以明显的发现,String的方法只是提供字符串“应该”提供的服务,比如说求字串等等。

StringBuilder则更注重建造一个怎样的字符串,StirngBuilder提供的方法基本都是在改变字符串本身,例如:往某个位置插入某些字符、字符串的逆置等等。

将String的建造过程抽象出来的原因:

  1. 使String的实例成为一个不可变的对象。
    如果String提供了例如StringBuilder中的append()方法,String对象就是成为了可变对象。(在学习JavaSE的时候,就知道String的实例是不可变的,本质原因是String没有提供方法,而是将这些方法抽象出来一个StringBuilder)

  2. String不是为了创建字符串。
    听着好像有点矛盾,就像上面说的,使用构造方法有时候只是创建一个“外壳”。(我们通常使用的StringBuilder时,就是先new一个“空壳”,然后调用各种方法向这个“壳子”中填数据)

得出结论:

经过上面的分析,StringBuilder就是把String中的创建部分抽象出来,使得创建过程与产品分离。

指挥者哪去了?

指挥者其实就是程序员,或者说是程序员编写的自定义类

所有字符串组成的集合本身就是一个无限集,所以不可能有一个统一的指挥者创建所有的字符串。根据不同的需求,需要产生不同的字符串,就可已根据需求写一个指挥者:

public class Director {
    private StringBuilder builder = new StringBuilder();

    public String toString(){
        ...
        builder.append(...);
        ...
        builder.insert(...);

        //返回产品
        return builder.toString();
    }
}
发布了213 篇原创文章 · 获赞 116 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/104216547
今日推荐