android设计模式(2)-----builder

什么是Builder模式呢。你通过搜索,会发现大部分网上的定义都是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


但是看完这个定义,并没有什么卵用,你依然不知道什么是Builder设计模式。在此个人的态度是学习设计模式这种东西,不要过度在意其定义,定义往往是比较抽象的,学习它最好的例子就是通过样例代码。


我们通过一个例子来引出Builder模式。假设有一个Person类,我们通过该Person类来构建一大批人,这个Person类里有很多 属性,最常见的比如name,age,weight,height等等,并且我们允许这些值不被设置,也就是允许为null,该类的定义如下。


<code style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="class" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">class</span></span><span class="class" style="margin:0px; padding:0px"> <span class="title" style="margin:15px 0px 25px; padding:0px; font-size:20px; font-weight:bold; text-align:center">Person</span> {<br style="margin:0px; padding:0px" /></span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> String name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">int</span> age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">double</span> height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">double</span> weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> String getName() {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setName(String name) {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.name = name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">int</span> getAge() {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setAge(<span class="keyword" style="margin:0px; padding:0px">int</span> age) {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.age = age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">double</span> getHeight() {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setHeight(<span class="keyword" style="margin:0px; padding:0px">double</span> height) {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.height = height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">double</span> getWeight() {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setWeight(<span class="keyword" style="margin:0px; padding:0px">double</span> weight) {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.weight = weight;<span class="indent" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />  </span>}
}</code>


然后我们为了方便可能会定义一个构造方法


<code style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">public</span> Person(String name, <span class="keyword" style="margin:0px; padding:0px">int</span> age, <span class="keyword" style="margin:0px; padding:0px">double</span> height, <span class="keyword" style="margin:0px; padding:0px">double</span> weight) {<br style="margin:0px; padding:0px" />        <span class="keyword" style="margin:0px; padding:0px">this</span>.name = name;<br style="margin:0px; padding:0px" />        <span class="keyword" style="margin:0px; padding:0px">this</span>.age = age;<br style="margin:0px; padding:0px" />        <span class="keyword" style="margin:0px; padding:0px">this</span>.height = height;<br style="margin:0px; padding:0px" />        <span class="keyword" style="margin:0px; padding:0px">this</span>.weight = weight;
    }</code>


或许为了方便new对象,你还会定义一个空的构造方法:


<code style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">public</span> Person() {
    }</code>


甚至有时候你很懒,只想传部分参数,你还会定义如下类似的构造方法。


<code style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">public</span> Person(String name) {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.name = name;
}<br style="margin:0px; padding:0px" /><span class="keyword" style="margin:0px; padding:0px">public</span> Person(String name, <span class="keyword" style="margin:0px; padding:0px">int</span> age) {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.name = name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.age = age;
}<span class="keyword" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />public</span> Person(String name, <span class="keyword" style="margin:0px; padding:0px">int</span> age, <span class="keyword" style="margin:0px; padding:0px">double</span> height) {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.name = name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.age = age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.height = height;
}</code>


于是你就可以这样创建各个需要的对象


<code style="margin:0px; padding:0px">Person p1=<span class="keyword" style="margin:0px; padding:0px">new</span> Person();
Person p2=<span class="keyword" style="margin:0px; padding:0px">new</span> Person(<span class="string" style="margin:0px; padding:0px">"张三"</span>);
Person p3=<span class="keyword" style="margin:0px; padding:0px">new</span> Person(<span class="string" style="margin:0px; padding:0px">"李四"</span>,<span class="number" style="margin:0px; padding:0px">18</span>);
Person p4=<span class="keyword" style="margin:0px; padding:0px">new</span> Person(<span class="string" style="margin:0px; padding:0px">"王五"</span>,<span class="number" style="margin:0px; padding:0px">21</span>,<span class="number" style="margin:0px; padding:0px">180</span>);
Person p5=<span class="keyword" style="margin:0px; padding:0px">new</span> Person(<span class="string" style="margin:0px; padding:0px">"赵六"</span>,<span class="number" style="margin:0px; padding:0px">17</span>,<span class="number" style="margin:0px; padding:0px">170</span>,<span class="number" style="margin:0px; padding:0px">65.4</span>);</code>


可以想象一下这样创建的坏处,最直观的就是四个参数的构造函数的最后面的两个参数到底是什么意思,可读性不怎么好,如果不点击看源码,鬼知道哪个是weight哪个是height。还有一个问题就是当有很多参数时,编写这个构造函数就会显得异常麻烦,这时候如果换一个角度,试试Builder模式,你会发现代码的可读性一下子就上去了。


我们给Person增加一个静态内部类Builder类,并修改Person类的构造函数,代码如下。


<code style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="class" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">class</span></span><span class="class" style="margin:0px; padding:0px"> <span class="title" style="margin:15px 0px 25px; padding:0px; font-size:20px; font-weight:bold; text-align:center">Person</span> {<br style="margin:0px; padding:0px" /></span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> String name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">int</span> age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">double</span> height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">double</span> weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>privatePerson(Builder builder){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.name=builder.name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.age=builder.age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.height=builder.height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.weight=builder.weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />public</span> String getName(){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setName(String name){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.name = name;<span class="indent" style="margin:0px; padding:0px">  </span><br style="margin:0px; padding:0px" />}<span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />public</span> <span class="keyword" style="margin:0px; padding:0px">int</span> getAge(){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px">  <br style="margin:0px; padding:0px" /></span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setAge(<span class="keyword" style="margin:0px; padding:0px">int</span> age){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.age = age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px"></span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">double</span> getHeight(){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px">  <br style="margin:0px; padding:0px" /></span><span class="keyword" style="margin:0px; padding:0px">public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setHeight(<span class="keyword" style="margin:0px; padding:0px">double</span> height){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.height = height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />public</span> <span class="keyword" style="margin:0px; padding:0px">double</span> getWeight() {<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />public</span> <span class="keyword" style="margin:0px; padding:0px">void</span> setWeight(<span class="keyword" style="margin:0px; padding:0px">double</span> weight){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.weight = weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px">  <br style="margin:0px; padding:0px" />  <br style="margin:0px; padding:0px" /></span><span class="keyword" style="margin:0px; padding:0px">static</span> <span class="class" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px">class</span> <span class="title" style="margin:15px 0px 25px; padding:0px; font-size:20px; font-weight:bold; text-align:center">Builder</span>{<br style="margin:0px; padding:0px" /></span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> String name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">int</span> age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">double</span> height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">private</span> <span class="keyword" style="margin:0px; padding:0px">double</span> weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> Builder name(String name){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.name=name;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> <span class="keyword" style="margin:0px; padding:0px">this</span>;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> Builder age(<span class="keyword" style="margin:0px; padding:0px">int</span> age){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.age=age;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> <span class="keyword" style="margin:0px; padding:0px">this</span>;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> Builder height(<span class="keyword" style="margin:0px; padding:0px">double</span> height){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.height=height;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> <span class="keyword" style="margin:0px; padding:0px">this</span>;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> Builder weight(<span class="keyword" style="margin:0px; padding:0px">double</span> weight){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">this</span>.weight=weight;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> <span class="keyword" style="margin:0px; padding:0px">this</span>;<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span>}<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">public</span> Person build(){<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span><span class="keyword" style="margin:0px; padding:0px">return</span> <span class="keyword" style="margin:0px; padding:0px">new</span> Person(<span class="keyword" style="margin:0px; padding:0px">this</span>);<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span><span class="indent" style="margin:0px; padding:0px">  </span>}<span class="indent" style="margin:0px; padding:0px"><br style="margin:0px; padding:0px" />  </span>}
}</code><div style="display: block;" class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>


从上面的代码中我们可以看到,我们在Builder类里定义了一份与Person类一模一样的变量,通过一系列的成员函数进行设置属性值,但是返回值都是this,也就是都是Builder对象,最后提供了一个build函数用于创建Person对象,返回的是Person对象,对应的构造函数在Person类中进行定义,也就是构造函数的入参是Builder对象,然后依次对自己的成员变量进行赋值,对应的值都是Builder对象中的值。此外Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强。


于是我们就可以这样创建Person类。


<code style="margin:0px; padding:0px">Person.Builder builder=<span class="keyword" style="margin:0px; padding:0px">new</span> Person.Builder();<br style="margin:0px; padding:0px" />Person person=builder<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>.name(<span class="string" style="margin:0px; padding:0px">"张三"</span>)<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>.age(<span class="number" style="margin:0px; padding:0px">18</span>)<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>.height(<span class="number" style="margin:0px; padding:0px">178.5</span>)<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>.weight(<span class="number" style="margin:0px; padding:0px">67.4</span>)<br style="margin:0px; padding:0px" /><span class="indent" style="margin:0px; padding:0px">  </span>.build();</code>


有没有觉得创建过程一下子就变得那么清晰了。对应的值是什么属性一目了然,可读性大大增强。


最后总结一下


  • 定义一个静态内部类Builder,内部的成员变量和外部类一样

  • Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)

  • Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder

  • 外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值