自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

學(xué)習(xí)Scala的定義工廠對(duì)象

開(kāi)發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第十章。Scala是一種針對(duì) JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語(yǔ)言。

你現(xiàn)在有了布局元素的類層級(jí)。這個(gè)層級(jí)可以“依原件”展現(xiàn)給你的客戶。但是你或許還是選擇把層級(jí)隱藏在工廠對(duì)象之后。工廠對(duì)象包含了構(gòu)建其它對(duì)象的方法??蛻襞c實(shí)惠使用這些工廠方法實(shí)現(xiàn)對(duì)象的構(gòu)造而不是直接使用new構(gòu)造對(duì)象。這種方式的一個(gè)好處是對(duì)象的創(chuàng)建可以被集中化并且對(duì)象實(shí)際代表類的細(xì)節(jié)可以被隱藏。這種隱藏一方面簡(jiǎn)化客戶理解你的庫(kù),因?yàn)楦俚募?xì)節(jié)被暴露出來(lái),另一方面提供給你更多機(jī)會(huì)在之后改變庫(kù)的實(shí)現(xiàn)而不會(huì)破壞客戶代碼。

51CTO編輯推薦:Scala編程語(yǔ)言專題

為布局元素構(gòu)建工廠的第一任務(wù)是選擇工廠方法應(yīng)該放在哪兒。它們應(yīng)該是單例對(duì)象成員還是類成員?包含它們的對(duì)象或類應(yīng)該怎么調(diào)用?這里有許多可能性。最直接的方案是創(chuàng)建類Element的伴生對(duì)象并把它做成布局元素的工廠方法。對(duì)于這種方式,你唯一要暴露給客戶的就是Element的類/對(duì)象組合,隱藏它的三個(gè)實(shí)現(xiàn)類ArrayElement,LineElement和UniformElement。

代碼10.10是遵循了這個(gè)方案的設(shè)計(jì)。Element伴生對(duì)象包含了三個(gè)重載的elem方法變體。每一個(gè)變體構(gòu)建一種不同的布局對(duì)象。

  1. object Element {  
  2. def elem(contents: Array[String]): Element =  
  3. new ArrayElement(contents)  
  4. def elem(chr: Char, width: Int, height: Int): Element =  
  5. new UniformElement(chr, width, height)  
  6. def elem(line: String): Element =  
  7. new LineElement(line)  
  8. }  
代碼 10.10 帶有工廠方法的工廠對(duì)象

這些工廠方法使得改變類Element的實(shí)現(xiàn)通過(guò)使用elem工廠方法實(shí)現(xiàn)而不用顯式地創(chuàng)建新的ArrayElement實(shí)例成為可能。為了不使用單例對(duì)象的名稱,Element,認(rèn)證而調(diào)用工廠方法,我們將在源文件頂上引用Element.elem。換句話說(shuō),代之以在Element類內(nèi)部使用Element.elem調(diào)用工廠方法,我們將引用Element.elem,這樣我們只要使用它們的簡(jiǎn)化名,elem,就可以調(diào)用工廠方法。代碼10.11展示了類Element在這些改變之后的樣子。

  1. import Element.elem  
  2. abstract class Element {  
  3. def contents: Array[String]  
  4. def width: Int =  
  5. if (height == 00 else contents(0).length  
  6. def height: Int = contents.length  
  7. def above(that: Element): Element =  
  8. elem(this.contents ++ that.contents)  
  9. def beside(that: Element): Element =  
  10. elem(  
  11. for (  
  12. (line1, line2) < - this.contents zip that.contents  
  13. ) yield line1 + line2  
  14. )  
  15. override def toString = contents mkString "\n" 
  16. }  
代碼 10.11 重構(gòu)以使用工廠方法的類Element

而且,有了工廠方法之后,子類ArrayElement,LineElement和UniformElement現(xiàn)在可以是私有的,因?yàn)樗鼈儾辉傩枰苯颖豢蛻粼L問(wèn)。Scala里,你可以在類和單例對(duì)象中定義其它的類和單例對(duì)象。因此一種讓Element的子類私有化的方式就是把它們放在Element單例對(duì)象中并在那里聲明它們?yōu)樗接小P枰臅r(shí)候,這些類將仍然能被三個(gè)elem工廠方法訪問(wèn)。代碼10.12展示了其中的細(xì)節(jié)。

  1. object Element {  
  2.  private class ArrayElement(  
  3.   val contents: Array[String]  
  4.  ) extends Element  
  5.  private class LineElement(s: String) extends Element {  
  6.   val contents = Array(s)  
  7.   override def width = s.length  
  8.   override def height = 1 
  9.  }  
  10.  private class UniformElement(  
  11.   ch: Char,  
  12.   override val width: Int,  
  13.   override val height: Int  
  14.  ) extends Element {  
  15.   private val line = ch.toString * width  
  16.   def contents = Array.make(height, line)  
  17.  }  
  18.  def elem(contents: Array[String]): Element =  
  19.   new ArrayElement(contents)  
  20.  def elem(chr: Char, width: Int, height: Int): Element =  
  21.   new UniformElement(chr, width, height)  
  22.  def elem(line: String): Element =  
  23.   new LineElement(line)  
  24. }  

代碼 10.12 用私有類隱藏實(shí)現(xiàn)

【相關(guān)閱讀】

  1. 如何實(shí)現(xiàn)Scala的above,beside和toString
  2. Scala學(xué)習(xí):使用組合與繼承
  3. 在Scala中定義final成員
  4. Scala程序中如何實(shí)現(xiàn)多態(tài)和動(dòng)態(tài)綁定
  5. Scala學(xué)習(xí):調(diào)用超類構(gòu)造器和override修飾符的使用

責(zé)任編輯:book05 來(lái)源: Artima
相關(guān)推薦

2009-07-20 16:56:51

Scala類的定義

2014-05-22 10:13:24

云辦公銳捷網(wǎng)絡(luò)

2009-07-21 08:21:46

Scala對(duì)象相等性

2009-07-21 12:18:37

ScalaRational對(duì)象toString

2009-11-16 17:04:46

Inside Scal

2009-07-21 16:58:31

Scala變量范圍

2009-07-22 07:43:00

Scala閉包

2009-07-21 17:21:57

Scala定義函數(shù)

2009-07-08 15:35:18

Case類Scala

2009-07-22 07:57:00

ScalaCurry化函數(shù)

2009-09-09 11:14:16

Scala對(duì)象

2021-10-25 12:00:16

智能建筑物聯(lián)網(wǎng)

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2009-08-03 11:07:18

Scala Actor

2010-03-11 10:34:22

Scala

2009-06-22 14:26:12

ScalaXML對(duì)象

2011-06-28 11:06:16

Scala

2009-07-22 08:57:49

Scalafinal

2012-06-28 09:40:04

惠普工作站HP Z620
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)