《Java是如何快速煮成C#的?》(一):相似的方法(2)

在上篇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是否也感觉很容易呢?

下一篇:《Java是如何快速煮成C#的?》(二):数据访问(1)

posted @ 2010-09-14 20:41  邀月  阅读(1044)  评论(8编辑  收藏  举报