邀月

          從.net中走來的Java愛好者
          posts - 22, comments - 10, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          在上篇《Java是如何快速煮成C#的?》(一):相似的方法中,我們開啟了C#與Java中的話題之一:相似的方法。本節我們再舉例說明,到底有多相似。

          我們用一個簡單的工廠模式的例子說明,順便復習下設計模式,呵呵。

          首先邀月得補充一下:

          1、語言對比:Java的文件名必須與類名匹配。在Java中,文件名必須遵循類的名稱。在C#中,雖然通常如此,但不是必需的。在C#中,可以有兩個class在一個文件中,并且從C#2.0開始,可能有一個Class跨越多個文件。

          2、簡單工廠(Simple Factory)模式
          Simple Factory模式根據提供給它的數據,返回幾個可能類中的一個類的實例。通常它返回的類都有一個公共的父類和公共的方法。

          好了,我們看一個C#/Java的類圖

          邀月工作室

          邀月工作室

          就類圖本身而言,除了String與string的大小寫之外,并無區別。兩個圖均用Powerdesigner所畫,只是依據模板分別為c#2.0和Java。

          基類:Namer

          派生類:FirstFirst和LastFirst均繼承Namer

          NameFactory實現了Namer的Create方法,在本例中為getName()。

          代碼對比如下:
          Namer(C#):

          using System;
          namespace NameFactory
          {
              
          /// <summary>
              
          /// Summary description for Namer.
              
          /// </summary>
              //Base class for getting split names
              public class Namer
              {
                  
          //parts stored here
                  protected string frName, lName;

                  
          //return first name
                  public string getFrname()
                  {
                      
          return frName;
                  }
                  
          //return last name
                  public string getLname()
                  {
                      
          return lName;
                  }
              }
          }
          Namer(Java):
          package com.factory.SimpleFactory;
          public class Namer {
               
          protected String frName, lName;

               
          //return first name
               public String getFrname()
               {
                   
          return frName;
               }
               
          //return last name
               public String getLname()
               {
                   
          return lName;
               }
          }
          FirstFirst(C#):
          using System;
          namespace NameFactory
          {
              
          /// <summary>
              
          /// Summary description for FirstFirst.
              
          /// </summary>
              public class FirstFirst : Namer
              {
                  
          public FirstFirst(string name)
                  {
                      
          int i = name.IndexOf(" ");
                      
          if (i > 0)
                      {
                          frName 
          = name.Substring(0, i).Trim();
                          lName 
          = name.Substring(i + 1).Trim();
                      }
                      
          else
                      {
                          lName 
          = name;
                          frName 
          = "";
                      }
                  }
              }
          }
          FirstFirst(Java):
          package com.factory.SimpleFactory;
          public class FirstFirst extends Namer {
              
          public FirstFirst(String name) {
                  
          int i = name.indexOf(" ");
                  
          if (i > 0) {
                      frName 
          = name.substring(0, i).trim();
                      lName 
          = name.substring(i + 1).trim();
                  } 
          else {
                      lName 
          = name;
                      frName 
          = "";
                  }
              }
          }
          LastFirst(C#):
          using System;
          namespace NameFactory
          {
              
          /// <summary>
              
          /// Summary description for LastFirst.
              
          /// </summary>
              public class LastFirst : Namer
              {
                  
          public LastFirst(string name)
                  {
                      
          int i = name.IndexOf(",");
                      
          if (i > 0)
                      {
                          lName 
          = name.Substring(0, i);
                          frName 
          = name.Substring(i + 1).Trim();
                      }
                      
          else
                      {
                          lName 
          = name;
                          frName 
          = "";
                      }
                  }
              }
          }
          LastFirst(Java):
          package com.factory.SimpleFactory;
          public class LastFirst extends Namer {
              
          public LastFirst(String name) {
                  
          int i = name.indexOf(",");
                  
          if (i > 0) {
                      lName 
          = name.substring(0, i);
                      frName 
          = name.substring(i + 1).trim();
                  } 
          else {
                      lName 
          = name;
                      frName 
          = "";
                  }
              }
          }
          NameFactory(C#):
          using System;
          namespace NameFactory
          {
              
          /// <summary>
              
          /// Summary description for NameFactory.
              
          /// </summary>
              public class NameFactory
              {
                  
          public NameFactory() { }

                  
          public Namer getName(string name)
                  {
                      
          int i = name.IndexOf(",");
                      
          if (i > 0)
                          
          return new LastFirst(name);
                      
          else
                          
          return new FirstFirst(name);
                  }
              }
          }
          NameFactory(Java):
          package com.factory.SimpleFactory;

          public class NameFactory {
              
          public NameFactory() {
              }

              
          public Namer getName(String name) {
                  
          int i = name.indexOf(",");
                  
          if (i > 0)
                      
          return new LastFirst(name);
                  
          else
                      
          return new FirstFirst(name);
              }
          }
          測試方法:(C#):
          using System;
          using System.Text;
          namespace NameFactory
          {
              
          class Program
              {
                  
          static string s;
                  
          private static NameFactory nameFact;

                  
          static void Main(string[] args)
                  {
                      System.Console.WriteLine(
          "please enter a string:");
                      s 
          = Console.ReadLine();
                      
          //s="zhang,tony";
                      ShowFactoryName(s);
                      Console.ReadKey();
                  }
                  
          static void ShowFactoryName(String input)
                  {
                      System.Console.WriteLine(
          "input:" + input);
                      nameFact 
          = new NameFactory();
                      Namer nm 
          = nameFact.getName(input);//此處可以用反射,類似于getClass方法
                      System.Console.WriteLine("FirstName:" + nm.getFrname());
                      System.Console.WriteLine(
          "LastName:" + nm.getLname());
                  }
              }
          }
          (Java):
          package com.factory.SimpleFactory;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;

          public class SimpleFactoryDemo1 {
              
          private static NameFactory nameFact;
              
          static String s;

              
          public static void main(String[] args) {
                  System.out.println(
          "please enter a string:");
                  
          try {
                      BufferedReader in 
          = new BufferedReader(new InputStreamReader(
                              System.in));
                      s 
          = in.readLine();
                  } 
          catch (IOException e) {
                  }
                  
          // s="zhang,tony";
                  ShowFactoryName(s);
              }

              
          static void ShowFactoryName(String input) {
                  System.out.println(
          "input:" + input);
                  nameFact 
          = new NameFactory();
                  Namer nm 
          = nameFact.getName(input);// 此處可以用反射,類似于getClass方法
                  System.out.println("FirstName:" + nm.getFrname());
                  System.out.println(
          "LastName:" + nm.getLname());
              }
          }

          正常情況下,分別得出如下結果:
          邀月工作室
          邀月工作室

          小結:從代碼的比較中,大多數情況下,改下大小寫,代碼就可以通用,只是命名空間可能有較大差異。如果你熟悉c#所有的類,Java是否也感覺很容易呢?





          邀月注:本文版權由邀月和博客園(BlogJava)共同所有,轉載請注明出處。
          助人等于自助!   3w@live.cn
          主站蜘蛛池模板: 宜兴市| 宁津县| 特克斯县| 巴林左旗| 内江市| 都江堰市| 宣城市| 昌图县| 怀来县| 德阳市| 武平县| 永修县| 浏阳市| 丁青县| 基隆市| 乌兰浩特市| 渭南市| 北海市| 安岳县| 德保县| 平昌县| 蒙阴县| 内江市| 广饶县| 靖州| 大厂| 昌邑市| 忻州市| 广西| 天长市| 大同市| 萨嘎县| 锡林浩特市| 灵寿县| 兴文县| 天镇县| 五大连池市| 安康市| 门头沟区| 蕉岭县| 称多县|