当前位置:编程学习 > C#/ASP.NET >>

工厂方法模式

    工厂方法(FactoryMethod)模式:是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。也就是说核心工厂类不再负责产品的创建,仅负责具体工厂子类必须实现的接口就行。这样抽象的好处是显而易见的,我们不再需要去修改具体工厂的角色了。
 
        例如下面的代码:是一个即将毕业的大学生,以学雷锋做好事的名义去帮助一位老人:
 
[csharp]  
 //雷锋类  
class LeiFeng  
{  
    public void Sweep()  
    {  
        Console.WriteLine("扫地");  
    }  
  
    public void Wash()  
    {  
        Console.WriteLine("洗衣");  
    }  
  
    public void BuyRice()  
    {  
        Console.WriteLine("买米");  
    }  
}  
  
//“学雷锋的大学生”类,继承雷锋  
class UnderGraduate : LeiFeng  
{  
}  
//客户端代码  
static void Main(string[] args)  
{  
    LeiFeng xueleifeng = new UnderGraduate();  
  
    xueleifeng.Wash();  
    xueleifeng.Sweep();  
    xueleifeng.BuyRice();  
}  
         现在如果添加人数,例如共3位同学做这些事,那么只需要实例化三个“学雷锋的大学生”对象了:
 
[csharp] 
 //客户端代码  
  
static void Main(string[] args)  
  
{  
  
    LeiFeng student1 = newUnderGraduate();  
  
    student1.Wash();  
  
    LeiFeng student2 = newUnderGraduate();  
  
    student2.Sweep();  
  
    LeiFeng studen3 = newUnderGraduate();  
  
    studen3.BuyRice();  
  
}  
         这时候就有人有异议了,难道只能大学生去学雷锋做好事吗?我们中学生也可以尽一己之力的。于是,这时候就不是单单实例化多个对象的问题了。
 
        于是雷锋工厂就来了。
 
[csharp]  
 //雷锋工厂  
  
interface Ifactory  
  
{  
  
    LeiFeng CreateLeiFeng();  
  
}  
  
  
  
//“学雷锋的大学生”工厂  
  
class UnderGraduateFactory : Ifactory   
  
{  
  
    public LeiFeng CreateLeiFeng()  
  
    {  
  
        return new UnderGraduate() ;  
  
    }  
  
}  
  
  
  
//“学雷锋的中学生”工厂  
  
class  MiddleStudentFactory : Ifactory  
  
{  
  
    public LeiFeng CreateLeiFeng()  
  
    {  
  
        return new MiddleStudent();  
  
    }  
  
}  
         客户端调用的时候只需要这样就可以了:
 
[csharp]  
 //客户端代码  
  
static void Main(string[] args)  
  
{  
  
    //工厂方法模式  
  
    Ifactory factory = newUnderGraduateFactory();   //要换成“中学生”,修改这里就行  
  
    LeiFeng student =factory.CreateLeiFeng();  
  
  
  
    student.BuyRice();  
  
    student.Wash();  
  
    student.Sweep();  
  
}  
         这时候怎么样,想换成中学生还不容易吗?
 
        通过以上的代码,我们可以看到,工厂方法克服了简单工厂违背“开放-封闭原则”的缺点,又保持了封装对象创建过程的优点,降低了客户程序与产品对象的耦合。可以说工厂方法模式是简单工厂模式的进一步抽象和推广。
 
        可是有一个问题,当我们每增加一个产品时,都需要加一个产品工厂的类,很显然会增加额外的开发量,那该怎么办呢?这又要说到-“反射”了。不过此篇博客不会细讲,在以后的抽象工厂模式中会有详解。
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,