邀月

从.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

只有注册用户登录后才能发表评论。


网站导航: