偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

學習Scala的定義工廠對象

開發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第十章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

你現在有了布局元素的類層級。這個層級可以“依原件”展現給你的客戶。但是你或許還是選擇把層級隱藏在工廠對象之后。工廠對象包含了構建其它對象的方法。客戶與實惠使用這些工廠方法實現對象的構造而不是直接使用new構造對象。這種方式的一個好處是對象的創(chuàng)建可以被集中化并且對象實際代表類的細節(jié)可以被隱藏。這種隱藏一方面簡化客戶理解你的庫,因為更少的細節(jié)被暴露出來,另一方面提供給你更多機會在之后改變庫的實現而不會破壞客戶代碼。

51CTO編輯推薦:Scala編程語言專題

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

代碼10.10是遵循了這個方案的設計。Element伴生對象包含了三個重載的elem方法變體。每一個變體構建一種不同的布局對象。

  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 帶有工廠方法的工廠對象

這些工廠方法使得改變類Element的實現通過使用elem工廠方法實現而不用顯式地創(chuàng)建新的ArrayElement實例成為可能。為了不使用單例對象的名稱,Element,認證而調用工廠方法,我們將在源文件頂上引用Element.elem。換句話說,代之以在Element類內部使用Element.elem調用工廠方法,我們將引用Element.elem,這樣我們只要使用它們的簡化名,elem,就可以調用工廠方法。代碼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 重構以使用工廠方法的類Element

而且,有了工廠方法之后,子類ArrayElement,LineElement和UniformElement現在可以是私有的,因為它們不再需要直接被客戶訪問。Scala里,你可以在類和單例對象中定義其它的類和單例對象。因此一種讓Element的子類私有化的方式就是把它們放在Element單例對象中并在那里聲明它們?yōu)樗接小P枰臅r候,這些類將仍然能被三個elem工廠方法訪問。代碼10.12展示了其中的細節(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 用私有類隱藏實現

【相關閱讀】

  1. 如何實現Scala的above,beside和toString
  2. Scala學習:使用組合與繼承
  3. 在Scala中定義final成員
  4. Scala程序中如何實現多態(tài)和動態(tài)綁定
  5. Scala學習:調用超類構造器和override修飾符的使用

責任編輯:book05 來源: Artima
相關推薦

2009-07-20 16:56:51

Scala類的定義

2009-07-21 12:18:37

ScalaRational對象toString

2009-07-21 08:21:46

Scala對象相等性

2009-11-16 17:04:46

Inside Scal

2009-07-21 16:58:31

Scala變量范圍

2009-07-22 07:43:00

Scala閉包

2014-05-22 10:13:24

云辦公銳捷網絡

2009-07-08 15:35:18

Case類Scala

2009-07-22 07:57:00

ScalaCurry化函數

2009-07-21 17:21:57

Scala定義函數

2009-09-09 11:14:16

Scala對象

2010-11-17 11:31:22

Scala基礎面向對象Scala

2009-08-03 11:07:18

Scala Actor

2010-03-11 10:34:22

Scala

2009-06-22 14:26:12

ScalaXML對象

2011-06-28 11:06:16

Scala

2009-07-22 08:57:49

Scalafinal

2009-07-22 07:47:00

Scala客戶代碼

2021-10-25 12:00:16

智能建筑物聯網
點贊
收藏

51CTO技術棧公眾號