在上篇《Java是如何快速煮成C#的?》(一):相似的方法中,我們開啟了C#與Java中的話題之一:相似的方法。本節(jié)我們再舉例說明,到底有多相似。
我們用一個簡單的工廠模式的例子說明,順便復(fù)習(xí)下設(shè)計模式,呵呵。
首先邀月得補充一下:
1、語言對比:Java的文件名必須與類名匹配。在Java中,文件名必須遵循類的名稱。在C#中,雖然通常如此,但不是必需的。在C#中,可以有兩個class在一個文件中,并且從C#2.0開始,可能有一個Class跨越多個文件。
2、簡單工廠(Simple Factory)模式
Simple Factory模式根據(jù)提供給它的數(shù)據(jù),返回幾個可能類中的一個類的實例。通常它返回的類都有一個公共的父類和公共的方法。
好了,我們看一個C#/Java的類圖


就類圖本身而言,除了String與string的大小寫之外,并無區(qū)別。兩個圖均用Powerdesigner所畫,只是依據(jù)模板分別為c#2.0和Java。
基類:Namer
派生類:FirstFirst和LastFirst均繼承Namer
NameFactory實現(xiàn)了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());
}
}
正常情況下,分別得出如下結(jié)果:


小結(jié):從代碼的比較中,大多數(shù)情況下,改下大小寫,代碼就可以通用,只是命名空間可能有較大差異。如果你熟悉c#所有的類,Java是否也感覺很容易呢?
邀月注:本文版權(quán)由邀月和博客園(BlogJava)共同所有,轉(zhuǎn)載請注明出處。
助人等于自助! 3w@live.cn