淺談Java常見設(shè)計模式(三)
其實你愛我像誰
扮演什么角色我都會
快不快樂我無所謂
為了你開心我忘記了累不累
接上文的繼續(xù)講,今天需要在城市類中新增一些屬性,一個城市不可能就是這么光禿禿的是吧,所以,首先在城市父類中增加了城市名稱、城市人口等屬性:

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

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

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

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

這里沒有對屬性做改變,是為了說明可能有些時候,有些數(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

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

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

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

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

這里一個接口Prototype,兩個城市實現(xiàn)這個接口,同時實現(xiàn)clone方法。可以暴露一個客戶端提供給別的方法調(diào)用,實現(xiàn)對象的拷貝創(chuàng)建。
從上面的代碼,可以看到,在實現(xiàn)克隆方法的時候,這個Edu,也是通過新創(chuàng)建的對象,即被克隆的對象的引用對象也是被拷貝了一份,這時候,把這種克隆稱為深克隆,與之對應(yīng)的還有一個淺克隆
比如,如果是這樣子,即是一個淺克隆:

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

對于原型模式,JDK提供了實現(xiàn)Cloneable接口,實現(xiàn)clone方法,可快速克隆對象。
原型模式,因為比較簡單,所以這里就先到這里了。
這里剩下一個比較簡單的問題,對于原型模式的對象,如果是單例的,那么在使用原型模式的時候,重寫了clone方法,則可能會破壞單例,這種情況下,應(yīng)該如何解決呢?
關(guān)注公眾號,回復(fù)“原型-單例”獲取答案:
點個再看,謝謝噢!
