Java物件學習之建立物件——使用靜態工廠方法代替構造器優點(一)
阿新 • • 發佈:2018-10-31
最近學習Android知識,發現Java好多的基礎知識運用的真的很一般,所以決定在重新梳理一下,現在Kotlin也來了,在Android之路上,留給我看Java的時間不多了。
靜態我們就來簡單介紹一下,使用靜態工廠方法建立物件相較於構造器建立的物件的優缺點。主要概括如下:
優點:
- 靜態工廠方法有名稱,可以明確的建立對應功能和屬性的Java物件
- 靜態工廠方法可以預構建Java物件,實現在必要的情況下建立儘量少的物件例項
- 靜態工廠方法可以獲取預構建Java物件的任何子類物件
- 靜態工廠方法在構建引數化例項的時候,程式碼更簡潔
缺點:
- Java類如果沒有公有的或者受保護的構建器,就不能被子類化
- 靜態工廠方法和一般靜態方法沒有任何區別
靜態工廠方法與構造器建立Java物件的對比已經介紹完了,下面就來針對優點當中的第一條結合程式碼說明一下。
1,靜態工廠方法優點一
需求:現在有一個需求,就是建立一組值為奇偶數相間的BigInteger陣列。
首先來看一下BigInteger的幾個構造方法:
BigInteger(byte[] val) 將包含 BigInteger 的二進位制補碼錶示形式的 byte 陣列轉換為 BigInteger。 |
BigInteger(int signum, byte[] magnitude) 將 BigInteger 的符號-數量表示形式轉換為 BigInteger。 |
BigInteger(int bitLength, int certainty, Random rnd) 構造一個隨機生成的正 BigInteger,它可能是一個具有指定 bitLength 的素數。 |
BigInteger(int numBits, Random rnd) 構造一個隨機生成的 BigInteger,它是在 0 到 (2numBits - 1)(包括)範圍內均勻分佈的值。 |
BigInteger(String val) 將 BigInteger 的十進位制字串表示形式轉換為 BigInteger。 |
BigInteger(String val, int radix) 將指定基數的 BigInteger 的字串表示形式轉換為 BigInteger。 |
發現有兩個問題:
(1)沒有引數對應值為奇數或者偶數物件的構造器
(2)構造器名稱一樣(無法改變的),對於值為奇數或者偶數的物件無法區分
為了解決上面的問題,我們建立了一個工廠類BigIntegerFactory,其程式碼如下:
package hfut.com.why;
import java.math.BigInteger;
import java.util.Random;
/**
*
* @author why
*
*/
public class BigIntegerFactory {
/**獲取大奇數物件
*
* @param numBits :
* @return
*/
public static BigInteger getOddNum(int numBits) {
BigInteger integer = new BigInteger(numBits, new Random());
if (Integer.parseInt(integer.toString()) % 2 != 0) {
return integer;
} else {
return new BigInteger(String.valueOf(Integer.parseInt(integer.toString()) + 1));
}
}
/** 獲取大偶數物件
*
* @param numBits :
* @return
*/
public static BigInteger getEvenNum(int numBits) {
BigInteger integer = new BigInteger(numBits, new Random());
if (Integer.parseInt(integer.toString()) % 2 == 0) {
return integer;
} else {
return new BigInteger(String.valueOf(Integer.parseInt(integer.toString()) + 1));
}
}
}
這樣當我們想獲取值為偶數或者奇數物件的時候就可以很簡單的通過很形象的靜態工廠方法獲取,比如:
package hfut.com.why;
import java.math.BigInteger;
import java.util.Random;
/**
*
* @author why
*
*
*/
public class TestFactory {
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
System.out.print("獲取的奇數為:" + BigIntegerFactory.getOddNum(10).toString() + "\t");
System.out.print(" 獲取的偶數為:" + BigIntegerFactory.getEvenNum(10).toString() + "\t");
System.out.println(" 隨機獲取數值為:" + new BigInteger(10, new Random()).toString());
}
}
}
測試結果如下:
我這個工廠裡面為了方便,有一個較明顯的錯誤,就是用Integer物件來解析BigInteger的資料,大家注意一下