復用與繼承 靜態工廠與構造器

2021-08-04 11:30:14 字數 1425 閱讀 6319

#1.復用與繼承

物件導向特性之一就是繼承,通過繼承可以實現**復用與功能擴充套件。但是卻破壞了另一種特性封裝性,這樣就很危險了,你底層實現本應封裝好,可卻被看得一清二楚,隨意更改。而復用就很好的解決這個問題,不但如此,繼承有的復用都有。通過在類中引用其他類,這樣既保障了類的封裝性,也保障了類功能擴充套件。

如:假設有乙個程式使用hashset,為了檢視它自建立以來曾經新增過多少個元素,我們可以通過繼承擴充套件hashset,重寫add和addall方法。

public class instrumentedhashsetextends hashset

public instrumentedhashset(int initcap, float loadfactor)

@override

public boolean add(e e)

@override

public boolean addall(collection<? extends e> c)

public int getaddcount()

}這段**看上去沒什麼問題,假如執行下面的程式,我們期望getaddcount返回3,但它實際上返回的是6。

instrumentedhashsets = new instrumentedhashset();

s.addall(arrays.aslist("snap", "crackle", "pop"));

system.out.println(s.getaddcount());

**出錯了?

在hashset內部,addall方法是基於add方法來實現的,即使hashset的文件中並沒有說明這一細節,這也是合理的。因此instrumentedhashset中的addall方法首先把addcount增加了3,然後利用super.addall()呼叫hashset的addall實現,在該實現中又呼叫了被instrumentedhashset覆蓋了的add方法,每個元素呼叫一次,這三次又分別給addcount增加了1,所以總共增加了6。

因此,使用繼承擴充套件乙個類很危險,父類的具體實現很容易影響子類的正確性。而復合優先於繼承告訴我們,不用擴充套件現有的類,而是在新類中增加乙個私有域,讓它引用現有類的乙個例項。這種設計稱為復合(composition)。

#2.靜態工廠與構造器

靜態工廠:不同於設計模式中的工廠,這樣只是乙個生成物件的方法,就是在類中實現乙個私有的方法,返回類物件,像單例模式中,單例模式的實現就是通過靜態工廠來實現,保障了物件的唯一性。

構造器:每乙個類都有乙個預設的構造器,如果你需要自定義乙個構造器,那就需要進行在構造器引數個數,型別等進行加以區分,構造器名字都是類名。

靜態工廠由於構造方法,不只是因為它能保證物件創造的唯一性,與重複使用,也因為它能自定義名字,很好的加以區分,並可以返回實現原返回型別的任何子型別,並在定義申明引數化類物件時很方便。

工廠模式與靜態工廠

1 工廠方法模式 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。2...

繼承與建構函式

派生類建構函式預設是呼叫基類預設建構函式 無引數的建構函式 書上的結論 比如說 基類vehicle public class vehicle public vehicle int a a 派生類 fourwheeledvehicle public class fourwheeledvehicle v...

靜態塊與構造

下面程式答案 public class b public static b t1 new b public static b t2 new b static system.out.println 構造塊 system.out.println 靜態塊 public static void main s...