2005年12月15日

                   雖然這篇文章和java沒什么關(guān)系,但我還是要貼出來和大家一起分享。因為這樣感人的文章現(xiàn)在已經(jīng)不多見了。這孩子太可憐,這個孩子的母親也很偉大,為了這樣的人間真情,我不禁落淚了....

            一天,正走在路上,手機響了,話筒里是個稚嫩的小女孩的聲音:“爸爸,你快回來吧,我好想你啊!”憑直覺,我知道又是個打錯的電話,因為我沒有女兒,只有個6歲的獨生子。這年頭發(fā)生此類事情也實在是不足為奇。我沒好氣的說了聲:“打錯了!”便掛斷了電話。 
             
            接下來幾天里,這個電話竟時不時地打過來,攪得我心煩,有時態(tài)度粗暴的回絕,有時干脆不接。 
             
            那天,這個電話又一次次打來,與往常不同的是,在我始終未接的情況下,那邊一直在堅持不懈的撥打著。我終于耐住性子開始接聽,還是那個女孩有氣無力的聲音:“爸爸,你快回來吧,我好想你啊!媽媽說這個電話沒打錯,是你的手機號碼,爸爸我好疼啊!媽媽說你工作忙,天天都是她一個人在照顧我,都累壞了,爸爸我知道你很辛苦,如果來不了,你就在電話里再親妞妞一次好嗎?”孩子天真的要求不容我拒絕,我對著話筒響響地吻了幾下,就聽到孩子那邊斷斷續(xù)續(xù)的聲音:“謝謝……爸爸,我好……高興,好……幸福……” 
             
            就在我逐漸對這個打錯的電話發(fā)生興趣時,接電話的不是女孩而是一個低沉的女聲:“對不起,先生,這段日子一定給您添了不少麻煩,實在對不起!我本想處理完事情就給您打電話道歉的。這孩子的命很苦,生下來就得了骨癌,她爸爸不久前又……被一場車禍奪去了生命,我實在不敢把這個消息告訴她,每天的化療,時時的疼痛,已經(jīng)把孩子折磨得夠可憐的了。當(dāng)疼痛最讓她難以忍受的時候,她嘴里總是呼喊著以前經(jīng)常鼓勵她要堅強的爸爸,我實在不忍心看孩子這樣,那天就隨便編了個手機號碼……” 
             
            “那孩子現(xiàn)在怎么樣了?”我迫不及待地追問。 
             
            “妞妞已經(jīng)走了,您當(dāng)時一定是在電話里吻了她,因為她是微笑著走的,臨走時小手里還緊緊攥著那個能聽到‘爸爸’聲音的手機……” 
             
            不知什么時候,我的眼前已模糊一片…… 
          posted @ 2005-12-15 03:39 Explore爪哇 閱讀(252) | 評論 (0)編輯 收藏

          2005年12月14日

          數(shù)據(jù)庫操作現(xiàn)在是項目開發(fā)的根本,學(xué)習(xí)Java首先應(yīng)該學(xué)會怎么樣連接數(shù)據(jù)庫,用Java連接數(shù)據(jù)庫可不像用Delphi這類工具那樣設(shè)幾個屬性就OK,說簡單也簡單,說復(fù)雜,其實也挺復(fù)雜的,而且很麻煩,如果是初學(xué),根本不能保證第一次就連接成功,下面以SQL Server 2000為例,說說Java連接數(shù)據(jù)庫的基本方法,也記錄一下心得。

          1、下載SQL Server 2000 driver for JDBC
          SQL Server 2000 Driver For JDBC Downloads
          該驅(qū)動截止目前有四個版本,建議下載最新的SP3版。
          該驅(qū)動安裝成功后,請將安裝目錄下的lib目錄下的三個.jar文件加到CLASSPATH中;如果你使用的是JBuilder或Eclipse,將這三個文件根據(jù)IDE的提示加到工程中也可。

          2、升級你的SQL Server 2000,為其打上最新的補丁。
          這一步可能不是必需的,因操作系統(tǒng)環(huán)境而定,在不打補丁的情況,有時可以正常連接,有時卻不能,所以建議還是安裝最新的SQL Server 2000補丁(SP4)和JDBC驅(qū)動(SP3)。
          如果你的程序在運行時提示:Error establishing socket,一般情況下,打上SQL Server 2000的補丁就可解決。

          3、驅(qū)動的加載方法
          在建立連接之前,要先加載SQL Server 2000 JDBC的驅(qū)動,代碼形式如下:
          Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
          在此注意,forName方法的參數(shù)字符串必須完全相同于以上內(nèi)容,大小寫是區(qū)分的,其實這個串就是驅(qū)動類的完整名稱:包名+類名。

          4、獲得一個連接
          在操作數(shù)據(jù)庫之前,要先獲得與數(shù)據(jù)庫的一個連接,使用如下代碼格式:
          DriverManager.getConnection(連接字符串, 登錄用戶名, 登錄密碼);
          例:
          DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs", "sa", "");
          在此處關(guān)鍵的是連接字符串的內(nèi)容,localhost部分即服務(wù)器的名字,可以更改;1433部分為SQL Server使用的端口號,根據(jù)實際情況修改即可;DatabaseName即為要連接的數(shù)據(jù)庫的名字,在此注意DatabaseName之前的是分號,而不是冒號。

          5、代碼實例

          // 導(dǎo)入Java SQL包,連接數(shù)據(jù)庫必需;
          import java.sql.*;

          public class TestDB {
          public static void main(String[] args) {
          String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
          String dbURL = "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs";
          String userName = "sa";
          String userPwd = "";
          Connection dbConn

          try {
          Class.forName(driverName);
          dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
          System.out.println("Connection Successful!");
          }
          Catch (Exception e) {
          e.printStackTrace();
          }
          }
          }

          6、可能出現(xiàn)的問題
          如果以上的代碼運行后,輸出"Connection Successful!",那就代表一切正常,連接數(shù)據(jù)庫成功,你可以進行Statement、ResultSet的操作了;反之的話,一定是出現(xiàn)了相應(yīng)的異常。
          如果提示錯誤"Error establishing socket",請根據(jù)之前的說明安裝相應(yīng)的SQL Server 2000補丁即可。
          如果提示"ClassNotFoundException",那一定是 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 該段代碼拼寫有誤,或者是SQL Server 2000 Driver For JDBC Lib目錄下的三個.jar文件未加入到CLASSPATH中。

          posted @ 2005-12-14 15:46 Explore爪哇 閱讀(469) | 評論 (0)編輯 收藏

          2005年12月8日

                工廠模式有簡單工廠模式,工廠方法模式和抽象工廠模式幾種形態(tài)。其中簡單工廠模式和工廠方法模式已經(jīng)在前面作過介紹。在這里,我們來介紹抽象工廠模式。

            抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具廣泛性的一種形態(tài)。

            抽象工廠模式的定義

            抽象工廠模式是工廠方法模式的進一步擴廣化和抽象化。我們給出抽象工廠模式的類圖定義如下。


                 圖1. 抽象工廠模式的類圖定義

            從上圖可以看出,簡單工廠模式涉及到以下的角色

             抽象工廠(AbstractFactory)類或接口

             擔(dān)任這個角色的是工廠方法模式的核心,它是與應(yīng)用程序無關(guān)的。任何在模式中創(chuàng)立對象的工廠類必須實現(xiàn)這個接口,或繼承這個類。

             實工廠類 (Conrete Factory)

             擔(dān)任這個角色的是與應(yīng)用程序緊密相關(guān)的,直接在應(yīng)用程序調(diào)用下,創(chuàng)立產(chǎn)品實例的那樣一些類。

             抽象產(chǎn)品 (Abstract Product)

             擔(dān)任這個角色的類是工廠方法模式所創(chuàng)立的對象的父類,或它們共同擁有的接口。

             實產(chǎn)品 (Concrete Product)

             擔(dān)任這個角色的類是工廠方法模式所創(chuàng)立的任何對象所屬的類。

            怎么這個類圖和工廠方法模式的類圖看起來是一樣的?

            是的,圖是一樣的,但是含義有很大的不同。必須指出,在抽象工廠模式中,抽象產(chǎn)品 (AbstractProduct) 可能是一個或多個,從而構(gòu)成一個或多個產(chǎn)品族(Product Family)。 在只有一個產(chǎn)品族的情況下,抽象工廠模式實際上退化到工廠方法模式。在上面的類圖中,只給出了一個產(chǎn)品族,相當(dāng)于位圖中的一個點,而完整的位圖應(yīng)當(dāng)是三維的,如下圖。



               圖2. 抽象工廠模式的位圖
           
            從位圖可以清楚地看到,與紙面垂直的數(shù)軸,即第三維軸,是代表產(chǎn)品族的數(shù)軸。上面的位圖中展示的是有兩個產(chǎn)品族,族A和族B的情形。

            在只有一個產(chǎn)品族時,第三維就坍縮掉,位圖也就只剩下兩維。這時抽象工廠模式就退化得與工廠方法模式一模一樣。

            在什么情形下應(yīng)當(dāng)使用抽象工廠模式

            在以下情況下,應(yīng)當(dāng)考慮使用抽象工廠模式。

            首先,一個系統(tǒng)應(yīng)當(dāng)不依賴于產(chǎn)品類實例被創(chuàng)立,組成,和表示的細節(jié)。這對于所有形態(tài)的工廠模式都是重要的。

            其次,這個系統(tǒng)的產(chǎn)品有多于一個的產(chǎn)品族。

            第三,同屬于同一個產(chǎn)品族的產(chǎn)品是設(shè)計成在一起使用的。這一約束必須得在系統(tǒng)的設(shè)計中體現(xiàn)出來。

            最后,不同的產(chǎn)品以一系列的接口的面貌出現(xiàn),從而使系統(tǒng)不依賴于接口實現(xiàn)的細節(jié)。

            其中第二丶第三個條件是我們選用抽象工廠模式而非其它形態(tài)的工廠模式的關(guān)鍵性條件。

            抽象工廠模式在小花果園系統(tǒng)中的實現(xiàn)

            現(xiàn)在,我們在佛羅里達的渡假小屋修整好啦。接下來,一項重要而光榮的工作,就是開發(fā)小屋后面的小花園。這意味著,我們有兩處小花園需要照料,一處在北方地區(qū),另一處在亞熱帶地區(qū)。抽象工廠模式正好適用于我們的情況。


          圖3. 抽象工廠模式應(yīng)用于小花果園系統(tǒng)中。三種不同的背景顏色可以區(qū)分工廠類,蔬菜類(第一產(chǎn)品族),和水果類的類圖(第二產(chǎn)品族)

                    兩處花園就相當(dāng)于兩個產(chǎn)品族。顯然,給北方花園的植物是要種植在一起的,給南方花園的植物是要另種植在一起的。這種分別應(yīng)當(dāng)體現(xiàn)在系統(tǒng)的設(shè)計上面。這就滿足了應(yīng)當(dāng)使用抽象工廠模式的第二和第三個條件。

          package com.javapatterns.abstractfactory;

          public interface Gardener {}

            代碼清單1. 接口 Gardener。


          package com.javapatterns.abstractfactory;

          public class NorthenGardener implements Gardener
          {
           public VeggieIF createVeggie(String name) { return new NorthernVeggie(name); }

           public FruitIF createFruit(String name) { return new NorthernFruit(name); }

          }

            代碼清單2. 實工廠類 NorthenGardener。


          package com.javapatterns.abstractfactory;

          public class TropicalGardener implements Gardener
          {
           public VeggieIF createVeggie(String name) { return new TropicalVeggie(name); }

           public FruitIF createFruit(String name) { return new TopicalFruit(name); }

          }

            代碼清單3. 實工廠類 TropicalGardener。


          package com.javapatterns.abstractfactory;

          public interface VeggieIF {}

            代碼清單4. 接口 VeggieIF。


          package com.javapatterns.abstractfactory;

          public class NorthernVeggie implements VeggieIF
          {
           public NorthernVeggie(String name) { this.name = name; }

           public String getName(){ return name; }

           public void setName(String name){ this.name = name; }

           private String name;
          }


          代碼清單5. 實產(chǎn)品類 NorthernVeggie。實產(chǎn)品類 NorthernFruit 與此極為類似,故略去。


          package com.javapatterns.abstractfactory;

          public class TropicalVeggie implements VeggieIF
          {
           public TropicalVeggie(String name) { this.name = name;}

           public String getName(){ return name; }

           public void setName(String name){ this.name = name; }

           private String name;
          }

            代碼清單6. 實產(chǎn)品類 TropicalVeggie。實產(chǎn)品類 TropicalFruit 與此極為類似,故略去。

            筆者對植物的了解有限,為免遺笑大方,在上面的系統(tǒng)里采用了簡化處理。沒有給出高緯度和低緯度的水果類或蔬菜類的具體名稱。

           抽象工廠模式的另一個例子

            這個例子講的是微型計算機的生產(chǎn)。產(chǎn)品族有兩個,PC(IBM系列)和Mac(MacIntosh系列)。顯然,我們應(yīng)該使用抽象工廠模式,而不是工廠方法模式,因為后者適合于處理只有一個產(chǎn)品族的情形。


          圖4. 抽象工廠模式應(yīng)用于微型計算機生產(chǎn)系統(tǒng)中。兩種不同的背景顏色可以區(qū)分兩類產(chǎn)品族,及其對應(yīng)的實工廠類

             關(guān)于模式的實現(xiàn)

            在抽象實現(xiàn)工廠模式時,有下面一些值得注意的技巧。

            第一丶實工廠類可以設(shè)計成單態(tài)類。很顯然,在小花果園系統(tǒng)中,我們只需要 NorthenGardener 和TropicalGardener 的一個實例就可以了。關(guān)于單態(tài)類的知識,請見<爪哇語言單態(tài)類創(chuàng)立性模式>。

            第二丶在實現(xiàn)抽象工廠模式時,產(chǎn)品類往往分屬多于一個的產(chǎn)品族,而針對每一族,都需要一個實工廠類。在很多情況下,幾個實工廠類都彼此相象,只有些微的差別。

            這時,筆者建議使用原始模型(Prototype)模式。這一模式會在以后介紹,屆時作者會進一步闡述這一點。

            第三丶設(shè)計更加靈活的實工廠。以微型計算機生產(chǎn)系統(tǒng)為例,PCProducer 是一個實工廠類,它的不靈活之處在于,每一種產(chǎn)品都有一個工廠方法。CPU 有createCPU(),RAM 有createRAM(),等等。如果一個已有的系統(tǒng)需要擴充,比如增加硬盤這一新產(chǎn)品,我們就需要增加一系列的接口 (createHD())丶類(HD, PCHD, MacHD)和方法。這似乎不很理想。

            一個解決的辦法是,把createCPU(),createRAM(), createHD()這幾個方法合并為一個createPart(String type)方法。這個合并后的方法返還一個Part接口。所有的產(chǎn)品都要實現(xiàn)這一接口,而CPU,RAM,和HD接口則不再需要了。每一個實產(chǎn)品都需要有一個屬性,表明它們的種類是CPU,RAM,和HD。

            這樣做的結(jié)果是,數(shù)據(jù)類型的豐富結(jié)構(gòu)被扁平化了。客戶端拿到的永遠是一個Part接口。這對客戶端而言不很安全。

            第四丶抽象工廠類可以配備靜態(tài)方法,以返還實工廠。設(shè)計的方法有兩種。

            一種是以一個靜態(tài)方法,按照參量的值,返回所對應(yīng)的實工廠。靜態(tài)方法的數(shù)據(jù)類型是抽象方法類。

            另一種是以每一個實工廠類都配備一個靜態(tài)方法,其數(shù)據(jù)類型是該實工廠類。

            問答題

            第1題。如上面的討論,抽象工廠類可以配備一個靜態(tài)方法,按照參量的值,返回所對應(yīng)的實工廠。請把微型計算機生產(chǎn)系統(tǒng)的抽象工廠類按照這一方案改造,給出UML類圖和源代碼。

            第2題。如上面的討論,抽象工廠類可以配備一系列靜態(tài)方法對應(yīng)一系列的實工廠。請把微型計算機生產(chǎn)系統(tǒng)的抽象工廠類按照這一方案改造,給出UML類圖和源代碼。

            第3題。如上面的討論,實工廠類可以設(shè)計成單態(tài)類。請在第1題的基礎(chǔ)上把微型計算機生產(chǎn)系統(tǒng)的實工廠類按照這一方案改造,給出UML類圖和源代碼。

           問答題答案

            第1題。微型計算機生產(chǎn)系統(tǒng)的抽象工廠原本是接口,現(xiàn)在需要改造成抽象類。


          圖5. 三種不同的背景顏色可以區(qū)分抽象工廠類,兩類產(chǎn)品族,及其對應(yīng)的實工廠類。ComputerProducer 類圖中類名為斜體表明該類是抽象的,而getProducer()的下劃線表明該方法是靜態(tài)的

          package com.javapatterns.abstractfactory.exercise1;

          public class ComputerProducer
          {
           public static ComputerProducer getProducer(String which)
           {
            if (which.equalsIgnoreCase("PC"))
            {
             return new PCProducer();
            }
            else (which.equalsIgnoreCase("Mac"))
            {
             return new MacProducer();
            }
           }
          }

            代碼清單7. 抽象類 ComputerProducer 的方法 getProducer(String which)。

            第2題。略。

            第3題。本題答案是在第1題基礎(chǔ)之上的。


          圖6. 三種不同的背景顏色可以區(qū)分抽象工廠類,兩類產(chǎn)品族,及其對應(yīng)的實工廠類。ComputerProducer 類圖中類名為斜體表明該類是抽象的,而getProducer()的下劃線表明該方法是靜態(tài)的。MacProducer 和 PCProducer 的構(gòu)造子是私有的,因此這兩個類必須自己將自己實例化。

          package com.javapatterns.abstractfactory.exercise3;

          abstract public class ComputerProducer
          {
           public static ComputerProducer getProducer(String which)
           {
            if (which.equalsIgnoreCase("PC"))
            {
             return PCProducer.getInstance();
            }
            else (which.equalsIgnoreCase("Mac"))
            {
             return MacProducer.getInstance();
            }
           }
          }

          代碼清單8.抽象工廠類ComputerProducer。


          package com.javapatterns.abstractfactory.exercise3;

          public class MacProducer extends ComputerProducer
          {
           private MacProducer() {
          }

          public CPU createCPU() {}

          public RAM createRAM() {}

          private static final m_MacProducer = new MacProducer();

          }

          代碼清單9. 實工廠類 MacProducer 是單態(tài)類。讀過筆者<單態(tài)創(chuàng)立性模式>一節(jié)的讀者應(yīng)當(dāng)知道,這里使用的單態(tài)類實現(xiàn)方法是餓漢式方法。

          package com.javapatterns.abstractfactory.exercise3;

          public class PCProducer extends ComputerProducer
          {
           private PCProducer() {
          }

          public CPU createCPU() {}

          public RAM createRAM() {}

          private static final m_PCProducer = new PCProducer();
          }

            代碼清單10. 實工廠類 PCProducer 是單態(tài)類,使用的單態(tài)類實現(xiàn)方法是餓漢式方法。

            各產(chǎn)品類沒有變化,因此不在此重復(fù)。
          posted @ 2005-12-08 17:56 Explore爪哇 閱讀(330) | 評論 (0)編輯 收藏
          僅列出標(biāo)題  
           
          主站蜘蛛池模板: 岳西县| 尉氏县| 瑞丽市| 安龙县| 万州区| 乌鲁木齐县| 渭南市| 齐河县| 英吉沙县| 新野县| 巴马| 固镇县| 绥宁县| 麻阳| 昭通市| 秦安县| 安乡县| 察哈| 乌恰县| 琼结县| 犍为县| 新建县| 东辽县| 乌兰浩特市| 诸城市| 宁波市| 游戏| 昭苏县| 分宜县| 新竹县| 内江市| 苍南县| 姚安县| 手游| 临清市| 湛江市| 高台县| 吐鲁番市| 巨野县| 栖霞市| 靖江市|