程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Effective Java (1) 考慮用靜態工廠方法代替構造器

Effective Java (1) 考慮用靜態工廠方法代替構造器

編輯:關於JAVA

一、前言

從今天開始計劃用一個月的時間,通過寫讀書筆記的方式來記錄閱讀這本Java領域經典中的經典書籍 - Effective Java過程中自己所思所想,以備以後查閱,同時分享出去也希望可以幫助到其他人,廢話不多說,現在開始第一篇:創建和銷毀對象。

二、考慮用靜態工廠方法代替構造器

①. 一般我們有什麼辦法可以創建對象呢?

方法1: 使用類公有構造器。

方法2:使用類的靜態方法返回一個實例。

②. 使用靜態方法創建對象有什麼優點?

優點1: 靜態工廠方法的名字是由我們自己命名,而構造方法必須與類同名。

PrimeNumber primeNumber1 = new PrimeNumber(int Random); // 返回一個素數  
PrimeNumber primeNumber2 = PrimeNumber.newInstance(); // 使用靜態工廠方法表示更為清楚

優點2: 構造方法每次調用的時候都需要創建一個對象,而靜態工廠方法每次調用的時候就不會創建一個新的對象,這對於一個要頻繁創建對象的程序來說,可以極大的提高性能,單例模式就是這樣實現的。

優點3: 靜態工廠方法可以返回原返回類型的任何子類型的對象,這樣使我們在選擇返回對象的類時就有了更大的靈活性。

class Father {  
    private Father() {  
    }  
       
    public static Father newInstance(String type) {  
        if (type.equals("ChildA")) { // 根據類型判斷返回那個子類對象  
            return new ChildA();  
        } else {  
            return new ChildB();  
        }  
    }  
      
    public void getName() {   
        System.out.println("My name is father");  
    }  
      
    private static class ChildA extends Father {  
        public void getName() {   
            System.out.println("My name is child A");  
        }  
    }  
      
    private static class ChildB extends Father {  
        public void getName() {  
            System.out.println("My name is child B");  
        }  
    }  
}  
      
public class Test {  
    public static void main(String[] args) {  
        Father c1 = Father.newInstance("ChildA");  
        c1.getName();  
        Father c2 = Father.newInstance("ChildB");  
        c2.getName();  
    }  
}

查看本欄目

優點4: 靜態工廠方法在創建參數化類型實例的時候,可以使代碼變得更加簡潔。

private Map<String, List<String>> map = new HashMap<String, List<String>>();  
public static <K, V> HashMap<K, V> newInstance() {  
    return new HashMap<K, V>();  
}

③. 使用靜態工廠方法創建對象有什麼缺點?

缺點1: 如果一個類只能通過靜態工廠方法來獲得實例,那麼該類的構造函數就不能是共有的或受保護的,那麼該類就不會有子類,即該類不能被繼承。單例模式中首先要私有化構造器。

缺點2:靜態工廠方法和其他靜態方法從名字上看無法區分,所以我們可以約定靜態工廠方法名字使用valueOf或者getInstance。

④. 什麼時候用靜態工廠方法,什麼時候用構造器呢?

靜態工廠方法和共有構造器各有用處,我們需要理解他們各自的長處,靜態工廠通常更加合適,因此切忌第一反應就是提供公有的構造器,而不先考慮靜態工廠。

作者:csdn博客 zdp072

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved