代码如下﹕
1:Namer的实现
using System; 
namespace NameFactory 
{  
public class Namer {  
     protected string frName, lName;  
       public string getFrname(){ 
return frName; 
       }  
     public string getLname() { 
            return lName; 
       } 
    } 
} 2:FirstFirst类的实现
using System; 
namespace NameFactory 

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 = ""; 



}3:LastFirst类的实现
using System; 
namespace NameFactory 

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 = ""; 
          } 
      } 

} 4:NameFactory,工厂的实现
using System; 
namespace NameFactory 

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 的getName方法为何要用Namer类名做关键字? 有何作用呢?
如果Namer不是类而是接口﹐又有何作用呢?
另﹕派生一个接口与派生一个类具体有什幺区别?

解决方案 »

  1.   

    工厂类NameFactory 的getName方法为何要用Namer类名做关键字? 有何作用呢?
    ---------------------------------------------------------------------
    这句不是很明白如果Namer不是类而是接口﹐又有何作用呢?
    ---------------------------------------------------------------------
    namer应该是接口。举dbFactory来说,dbFactory返回的应该是IDB的接口类型的,如IDbConnection,IDbTranction,至于使用的时候获取的实例究竟是sqlConnection还是oracleConnection调用方并不清楚。
      

  2.   

    Namer 是该方法的返回值类类型,不是接口.
    工厂方法里必须这样才能创建产品实例
      

  3.   

    可以转化啥来IDbConnection来说嘛你可以这样用IDbConnection idb = ...... 赋值((SqlConnection)idb).... 这样使用,就调用了SqlConnection的方法了
      

  4.   

    ==》工厂类NameFactory 的getName方法为何要用Namer类名做关键字? 有何作用呢?
    Namer可以理解为一个接口,它是你需要创建对象的抽象,它是一个类型,它的指针(引用)可以指向一个具体的类型(比如:FirstFirst)。这些具体的类型都有Namer的特性,即:getFrname和getLname这些公共方法。
    ==》如果Namer不是类而是接口﹐又有何作用呢?
    效果一样,只是所有的实现需要在实现接口的类中显式实现,接口是类型,类是接口的实现,从严格的意义上来说两者的语意是不同的。但是一定要记住:接口就是类型。
    ==》另﹕派生一个接口与派生一个类具体有什幺区别?
    类通常是一个类型的实例,接口更灵活,但是需要实现者做的事情也越多。在实现上两者的区别是:一个有实现(部分或者全部)一个没有任何实现。
      

  5.   

    工厂类NameFactory 的getName方法为何要用Namer类名做关键字==>get方法的返回值类型为Namer。此方法可以返回任何一个派生于Namer的类的对象(FirstFirst,LastFirst)。这正是factory pattern的作用,根据输入参数的不同创建派生于同一个类的不同派生类的实例。这是《设计模式C#版》中的一个例子吧!
      

  6.   

    你完全可以用接口代替你的namer,完全抽象你的Namer,使其成为抽象工厂,然后下面建立实现工厂,又实现工厂产生具体产品..这样就可以产生高度抽象的工厂对象,对于新产品的添加只需增加对应的实现工厂,而实现工厂全部由抽象工厂来定义产生..由此完成金字塔结构..
      

  7.   

    问:工厂类NameFactory 的getName方法为何要用Namer类名做关键字? 有何作用呢?
    答:做用是只要是Namer的子类都可以返回.这样当Namer子类有扩展时,上面调用这个方法的代码可以不用改变.
    ----------------------------------------------------------------------
    问:如果Namer不是类而是接口﹐又有何作用呢?
    答:接口能做到与此相同的作用.不过接口可以多继承,所以更灵活.
    ----------------------------------------------------------------------
    问:派生一个接口与派生一个类具体有什幺区别?
    答:派生自类一般表明"是"的概念,而派生自接口表明"具有"的概念.如:有个接口叫"名字",人和狗都可以派生自它(现在的狗一般都有名字了,呵呵),但有个类叫"职员",子类可以有"项目经理","程序员"等.选择接口和超类时可以这样思考.