<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          淺談Java常見設(shè)計模式(三)

          共 1150字,需瀏覽 3分鐘

           ·

          2021-03-01 23:26



          其實你愛我像誰

          扮演什么角色我都會
          快不快樂我無所謂
          為了你開心我忘記了累不累



          接上文的繼續(xù)講,今天需要在城市類中新增一些屬性,一個城市不可能就是這么光禿禿的是吧,所以,首先在城市父類中增加了城市名稱、城市人口等屬性:


          41042f50db3d18474a8cb23b8c0c3334.webp


          接著,定義了一個教育類,教育類包含了一些基本的東西,比如學(xué)校數(shù)量、老師數(shù)量等:


          57421292d61ae301a175e0322230ba4b.webp


          緊接著,定義的ChongQingCityBase繼承了城市父類,同時擁有Edu這個屬性:


          39a06d2a43deb15779b9dad60ea7c835.webp



          這時候,簡單測試下構(gòu)建ChongQingCityBase對象出來:


          86f9c862bc3212b9be6caac451fc700c.webp


          這些都很簡單,沒有什么太大的問題。



          那么接下來,有一個需求,假定這里初始化對象根據(jù)年月份構(gòu)建對象,即這里可以創(chuàng)建“2020年1月的重慶”,然后需要創(chuàng)建一個“2020年2月的重慶”,這時候,一般來說,下面的代碼就出來了:


          abd9853f4003aab828fcf2751c7d8c96.webp


          這里沒有對屬性做改變,是為了說明可能有些時候,有些數(shù)據(jù),在月份之間變動不會那么大(比如學(xué)校數(shù)量),那么這個時候,如果可以直接復(fù)制出來一個1月的對象,然后直接修改一下有變化的屬性,這樣子,看起來,是不是可能好些?



          于是基于這種復(fù)制的思想,就誕生了一種新的設(shè)計模式:原型模式



          原型模式(Prototype Pattern):是指原型實例指定創(chuàng)建對象的種類,并通過拷貝這些原型對象創(chuàng)建新的對象。


          調(diào)用者不需要知道任何創(chuàng)建細節(jié),不調(diào)用構(gòu)造方法。


          原型模式適用場景:


          1)、類初始化需要消耗比較多的資源

          2)、調(diào)用構(gòu)造方法創(chuàng)建對象,需要比較復(fù)雜的過程


          基于此,先直接看下新的代碼結(jié)構(gòu)


          首先定義一個接口Prototype


          2b1372a80cad2dc0b141cb18742a826e.webp


          接口定義了一個clone方法,然后讓城市類實現(xiàn)這個接口,實現(xiàn)這個clone方法:


          131f315389542588a4e6b9840cca8f68.webp


          然后有一個客戶端調(diào)用代碼:


          0b5ca5bbc7b7cd3b69e5d44186f7e4af.webp


          這時候,對于創(chuàng)建2個月份的城市,直接就是這樣了:


          44ecddfb238d92a33553b6336f41667b.webp


          這里,只調(diào)用了這個clone方法,即完成了新的對象的創(chuàng)建。


          簡單看下類圖:


          05b15383eefa7b43c1bffd2e89a15418.webp


          這里一個接口Prototype,兩個城市實現(xiàn)這個接口,同時實現(xiàn)clone方法。可以暴露一個客戶端提供給別的方法調(diào)用,實現(xiàn)對象的拷貝創(chuàng)建。



          從上面的代碼,可以看到,在實現(xiàn)克隆方法的時候,這個Edu,也是通過新創(chuàng)建的對象,即被克隆的對象的引用對象也是被拷貝了一份,這時候,把這種克隆稱為深克隆,與之對應(yīng)的還有一個淺克隆


          比如,如果是這樣子,即是一個淺克隆:


          f90395282a75e9f431af820c99097d8b.webp


          這時候,再次運行上述的main方法。得到的就是:


          d7d2d158408241722f678b9f6ba8e26a.webp


          對于原型模式,JDK提供了實現(xiàn)Cloneable接口,實現(xiàn)clone方法,可快速克隆對象。


          原型模式,因為比較簡單,所以這里就先到這里了。


          這里剩下一個比較簡單的問題,對于原型模式的對象,如果是單例的,那么在使用原型模式的時候,重寫了clone方法,則可能會破壞單例,這種情況下,應(yīng)該如何解決呢?




          關(guān)注公眾號,回復(fù)“原型-單例”獲取答案:



          點個再看,謝謝噢!

          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  干逼免费视频 | 色婷婷国产精品秘 免 | 久久视频网址 | 丁香婷婷色五月激情综合 | 俺去也俺来也 |