<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### Change Value to Reference(將實值對象改為引用對象) 你有一個class,衍生出許多相等實體(equal instances),你希望將它們替換為單一對象。 將這個value object (實值對象)變成一個reference object (引用對象)。 ![](https://box.kancloud.cn/2016-08-15_57b1b56cdf458.gif) **動機(Motivation)** 在許多系統中,你都可以對對象做一個有用的分類:reference object和value objects。前者就像「客戶」、「帳戶」這樣的東西,每個對象都代表真實世界中的一個實物,你可以直接以相等操作符(==,用來檢驗同一性,identity)檢査兩個對象 是否相等。后者則是像「日期」、「錢」這樣的東西,它們完全由其所含的數據值來定義,你并不在意副本的存在;系統中或許存在成百上千個內容為"1/1/2000"的「日期」對象。當然,你也需要知道兩個value objects是否相等,所以你需要覆寫equals()和hashCode())。 要在reference object和value objects之間做選擇有時并不容易。有時候,你會從一個簡單的value objects開始,在其中保存少量不可修改的數據。而后,你可能會希望給這個對象加入一些可修改數據,并確保對任何一個對象的修改都能影響到所有引用此一對象的地方。這時候你就需要將這個對象變成一個reference object。 **作法(Mechanics)** - 使用Replace Constructor with Factory Method。 - 編譯,測試。 - 決定由什么對象負責提供訪問新對象的途徑。 - 可能是個靜態字典(static dictionary)或一個注冊對象(registry object)。 - 你也可以使用多個對象作為新對象的訪問點(access point)。 - 決定這些reference object應該預先創建好,或是應該動態創建。 - 如果這些reference object是預先創建好的,而你必須從內存中將它們讀取出來,那么就得確保它們在被需要的時候能夠被及時加載。 - 修改factory method[5],令它返回reference object。 - 如果對象是預先創建好的,你就需要考慮:萬一有人索求一個其實并不存在的對象,要如何處理錯誤? - 你可能希望對factory method使用Rename Method,使其傳達這樣的信息:它返回的是一個既存對象。 - 編譯,測試。 [5]譯注:此處之factory method不等同于GoF在《Design Patterns》書中提出的Factory Method。為避免混淆,讀者應該將此處的factory method理解為"Creational Method",亦即「用以創建某種實體」的函數,這個概念包含GoF的Factory Method,而又比Factory Method廣泛。 **范例(Example)** 在Replace Data Value with Object 一節中,我留下了一個重構后的程序,本節范例就從它開始。我們有下列的Customer class: ~~~ class Customer { public Customer (String name) { _name = name; } public String getName() { return _name; } private final String _name; } ~~~ 它被以下的Ordre class使用: ~~~ class Order... public Order (String customerName) { _customer = new Customer(customerName); } public void setCustomer(String customerName) { _customer = new Customer(customerName); } public String getCustomerName() { return _customer.getName(); } private Customer _customer; ~~~ 此外,還有一些代碼也會使用Customer對象: ~~~ private static int numberOfOrdersFor(Collection orders, String customer) { int result = 0; Iterator iter = orders.iterator(); while (iter.hasNext()) { Order each = (Order) iter.next(); if (each.getCustomerName().equals(customer)) result++; } return result; } ~~~ 到目前為止,Customer對象還是value object。就算多份定單屬于同一客戶,但每個Order對象還是擁有各自的Customer對象。我希望改變這一現狀,使得一旦同 一客戶擁有多份不同定單,代表這些定單的所有Order對象就可以共享同一個Customer對象。本例中這就意味:每一個客戶名稱只該對應一個Customer對象。 首先我使用 Replace Constructor with Factory Method。這樣,我就可以控制Customer對象的創建過程,這在以后會是非常重要的。我在Customer class中定義這個factory method: ~~~ class Customer { public static Customer create (String name) { return new Customer(name); } ~~~ 然后我把「對構造函數的調用」替換成「對factory method的調用」: ~~~ class Order { public Order (String customer) { _customer = Customer.create(customer); } ~~~ 然后我再把構造函數聲明為private: ~~~ class Customer { private Customer (String name) { _name = name; } ~~~ 現在,我必須決定如何訪問Customer對象。我比較喜歡通過另一個對象(例如Order class中的一個值域)來訪問它。但是本例并沒有這樣一個明顯的值域可用于訪問Customer對象。在這種情況下,我通過會創建一個注冊(登錄)對象,作為訪問點。為了簡化我們的例子,我把Customer對象保存在Customer class的一個static值域中,讓Customer class作為訪問點: ~~~ private static Dictionary _instances = new Hashtable(); ~~~ 然后我得決定:應該在接到請求時創建新的Customer對象,還是應該預先將它們創建好。這里我選擇后者。在應用程序的啟動代碼(start-up code)中,我先把需要使用的Customer對象加載妥當。這些對象可能來自數據庫,也可能來自文件。為求簡單起見,我在代碼中明確生成這些對象。反正以后我總是可以使用 Substitute Algorithm 來改變它們的創建方式。 ~~~ class Customer... static void loadCustomers() { new Customer ("Lemon Car Hire").store(); new Customer ("Associated Coffee Machines").store(); new Customer ("Bilston Gasworks").store(); } private void store() { _instances.put(this.getName(), this); } ~~~ 現在,我要修改factory method,讓它返回預先創建好的Customer對象: ~~~ public static Customer create (String name) { return (Customer) _instances.get(name); } ~~~ 由于create()總是返回既有的Customer對象,所以我應該使用Rename Method 修改這個factory method的名稱,以便強調(說明)這一點。 ~~~ class Customer... public static Customer getNamed (String name) { return (Customer) _instances.get(name); } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看