<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    范例(Examples)
    在Replace Data Value with Object(175)一節中,我留下了一個重構后的程序,本節范例就從它開始。我們有下列的Customer class:
    class Customer {
        public Customer(String name) {
           _name = name;
        }

        public String getName() {
           return _name;
        }
        private final String _name;
    }
    它被以下的order class使用:
    class Order...
        public Order(String customer) {
           _customer = new Customer(customer);
        }

        public String getCustomer() {
           return _customer.getName();
        }
       
        public void setCustomer(String arg) {
           _customer = new Customer(arg);
        }
        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.getCustomer().equals(customer)) result ++;
        }
        return result;
    }
    到目前為止,Customer對象還是value object。就算多份定單屬于同一客戶,但每個order對象還是擁有各自的Customer對象。我希望改變這一現狀,使得一旦同一客戶擁有多份不同定單,代表這些定單的所有Order對象就可以共享同一個Customer對象。

    首先我使用Replace Constructor with Factory Method(304)。這樣,我就可以控制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 _instance = new Hashtable();

    然后我得決定:應該在接到請求時創建新的Customer對象,還是應該預先將它們創建好。這里我選擇后者。在應用程序的啟動代碼(start-up code)中,我先把需要使用的Customer對象加載妥當。這些對象可能來自數據庫,也可能來自文件。為求簡單起見,我在代碼中明確生成這些對象。反正以后我總是可以使用Substitute Algorithm(139)來改變它們的創建方式。
    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() {
           _instance.put(this.getName(), this);
        }
    現在,我要修改factory method,讓它返回預先創建好的Customer對象:
    public static Customer create(String name) {
        return (Customer)_instance.get(name);
    }
    由于create()總是返回既有的Customer對象,所以我應該使用Rename Method(273)修改這個factory method的名稱,以便強調(說明)這一點。
    class Customer...
    public static Customer getNamed(String name) {
        return (Customer)_instances.get(name);
    }
    posted on 2005-09-01 14:16 ivaneeo 閱讀(188) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
    主站蜘蛛池模板: 日本媚薬痉挛在线观看免费| 一区二区三区免费视频观看| 亚洲美女自拍视频| 亚洲精品午夜无码电影网| 国产精品亚洲产品一区二区三区| 全部免费a级毛片| 亚洲国产精品一区二区三区久久| avtt亚洲天堂| 亚洲综合另类小说色区色噜噜| 亚洲欧洲日产国码高潮αv| 国产偷国产偷亚洲高清日韩| 国产亚洲情侣一区二区无| 亚洲日韩小电影在线观看| 日韩亚洲欧洲在线com91tv| 亚洲成色在线影院| 亚洲国产精品成人精品软件| 亚洲国产午夜电影在线入口| 亚洲AV日韩综合一区尤物| 亚洲码和欧洲码一码二码三码| 亚洲中文字幕久久精品蜜桃| 久久亚洲色WWW成人欧美| 成人久久久观看免费毛片| a国产成人免费视频| 无码日韩精品一区二区免费暖暖| 国产好大好硬好爽免费不卡 | 久久亚洲精品AB无码播放| 亚洲视频.com| 亚洲一级特黄特黄的大片| 日韩亚洲综合精品国产| 免费一级毛suv好看的国产网站 | 成年免费a级毛片| 成人A片产无码免费视频在线观看| 午夜无码A级毛片免费视频| 91成年人免费视频| 日韩成人免费视频播放| 亚洲国产婷婷香蕉久久久久久| 国产亚洲一区二区在线观看| 亚洲图片校园春色| 牛牛在线精品免费视频观看| 久久免费精品视频| 午夜一区二区免费视频|