成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學習Scala的定義工廠對象

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

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

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

為布局元素構建工廠的第一任務是選擇工廠方法應該放在哪兒。它們應該是單例對象成員還是類成員?包含它們的對象或類應該怎么調用?這里有許多可能性。最直接的方案是創建類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工廠方法實現而不用顯式地創建新的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單例對象中并在那里聲明它們為私有。需要的時候,這些類將仍然能被三個elem工廠方法訪問。代碼10.12展示了其中的細節。

  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程序中如何實現多態和動態綁定
  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-07-22 07:43:00

Scala閉包

2009-07-21 16:58:31

Scala變量范圍

2009-11-16 17:04:46

Inside Scal

2014-05-22 10:13:24

云辦公銳捷網絡

2009-07-21 17:21:57

Scala定義函數

2009-07-08 15:35:18

Case類Scala

2009-07-22 07:57:00

ScalaCurry化函數

2009-09-09 11:14:16

Scala對象

2021-10-25 12:00:16

智能建筑物聯網

2009-08-03 11:07:18

Scala Actor

2009-07-22 08:57:49

Scalafinal

2010-03-11 10:34:22

Scala

2009-06-22 14:26:12

ScalaXML對象

2011-06-28 11:06:16

Scala

2010-11-17 11:31:22

Scala基礎面向對象Scala

2009-07-22 07:47:00

Scala客戶代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本天堂一区 | aaa天堂| 中文字幕在线一 | 日韩精品激情 | 欧美视频一区二区三区 | 国产原创在线观看 | 日本五月婷婷 | 亚洲国产精品久久久久婷婷老年 | 日韩免费视频一区二区 | 国产一区二区三区四区五区加勒比 | 久久青视频 | 激情网站 | 视频一区二区中文字幕 | 亚洲一区二区三区在线播放 | 国产一区在线免费 | 中文日韩字幕 | 国产精品久久久久久久午夜片 | 欧美黄色网 | 日本三级黄视频 | 免费观看a级毛片在线播放 黄网站免费入口 | 夜夜骑综合 | 国产精品自在线 | 国产一级电影在线观看 | 久久精品男人的天堂 | 国产精品一区二区不卡 | 国产福利一区二区 | 欧美精品一区二区三区在线播放 | 天天摸天天干 | 国产精品久久久久久久白浊 | 久久综合九色综合欧美狠狠 | 久久99精品久久 | 伊色综合久久之综合久久 | 国产视频精品在线 | 精品一区二区三区在线播放 | 欧美在线视频一区二区 | 成人三级网址 | 日日夜夜免费精品 | 无码一区二区三区视频 | 在线观看国产 | 日本精品视频一区二区三区四区 | 视频一区二区国产 |