由于代码写得不多,没什么经验~~所以无法领略设计模式中的神髓~~工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个实例化延迟到其子类。我想问一下工厂方法模式对程序以后的扩展到底有何作用~~~~?
IFactory factory=new UndergraduateFactory();//IFactory为接口,UndergraduateFactory为其子类
LeiFeng student=factory.CreateLeiFeng();    student.BuyRice();
student.Sweep();
student.Wash();在上面的代码中
IFactory factory=new UndergraduateFactory();
LeiFeng student=factory.CreateLeiFeng();    
本可以用
LeiFeng student=new LeiFeng();
就搞定的,为上面要把new LeiFeng();放在UndergraduateFactory类的CreateLeiFeng()中来执行~~~~???
这样的工厂方法模式到底对整个程序以后的扩展修改由什么帮助?

解决方案 »

  1.   


    当你不知道new LeiFeng还是别的什么类型,只知道它必定是LeiFeng或者其子类时,你希望确定该new什么时候不用重新修改实例化sdudent的部分的代码)甚至根本不重新编译它,就可以写CreateLeiFeng。如果你没有这个需求,那么就不必写。
      

  2.   

    你希望确定该new什么时候不用重新修改实例化sdudent的部分的代码——好生涩,再通俗点好吗
      

  3.   

    多种数据库?不太清楚LeiFeng跟数据库有没有什么关系。如果你不确定该new LeiFeng还是new XXXX,这个XXXX应该用LeiFeng的子类来代替,如果你不确定,就根本不能写死成为new LeiFeng。想不通为什么自己“无法确定是否XXX这个位置一定写LeiFeng),那么就说明你还从来没有过这类需求,那么就不要想破脑袋。没有需求,就不必这么写。等你能够提出这类需求,自然有人会给随随便便说一句(写到一个CreateLeiFeng方法里),而你用3秒钟就懂了。
      

  4.   

    唉,算了,还是给你说说核心概念吧。比如我要写加法程序:int a=1;
    int b=2;
    int c=a+b;
    Console.WriteLine("c={0}",c);
    加入我本来以为要写这个程序就能交差,可是老师偏偏对我的c变量的计算挑三拣四,可是他也是模模糊糊地说不出了所以然,而我也不敢认为加法运算就是“a+b”这么简单了,想得脑袋疼了,怎么办?我可以把这个责任甩给老师自己去写:int a=1;
    int b=2;
    int c=Plus.Calculate(a,b);
    Console.WriteLine("c={0}",c);谁有本事谁去写Calculate方法吧,只要它返回int我能调用就行了。就是这么简单的东西,这就是模式玩的东西,模式都是把最简单的东西吹的神乎其神,你没有需求、没做过变化多一点的程序时,以为她很神。等做过了,才知道它其实就是把一些简单的东西弄成了独立的class或者interface,然后起了一个特别雷人的名字,让人不好认出来。
      

  5.   

    就像 sq1234 说的一样,不要为了模式而模式,实际上在开发多,基础加强了,解决问题的能力提高,才发现自己用的一些解决方法被叫做XX模式。如果不是为了解决一些问题而硬套用一些模式的话,并且自己也不熟悉这种方式,搞到最后出现问题也无法找出问题。
    另外你所说的工厂模式:顾名思义,现实生活中的工厂主要为了生产产品,而程序开发中,就是生产对象(接口、类等),一般在开发程序时,有些程序的很多模块都具有相同的功能,而往往我们会把这些相同的功能的对象都继承同一接口,在实际应用中我们更多的喜欢直接调用接口,但接口必须实例到实现该接口的类,这时便可通过工厂模式生产出实现这个接口的具体类,虽然这些类都具有相同的接口,不过每个具体类对接口的成员(方法)的操作有所差别,因此调用时,根据需要生产出这个模块(功能)的具体类,在外部统一调用时则无需关心是哪个具体类,只要操作这个接口就行。
      

  6.   

     你看看下面的文章
    http://terrylee.cnblogs.com/archive/2006/01/04/310716.html?page=1#pagedcomment
    主要就是为了应对变化,如果代码中都这么写LeiFeng student=new LeiFeng(); 将来需要换成
    HuangJiGuang hjg = new HuangJiGuang();你要把所有的LeiFeng都改成HuangJiGuang,而用了工厂方法模式后能尽可能的减小这种改动带来的影响
      

  7.   

    谢谢~~上面各位的帮助。
    我昨天在家里晚上在家里郁闷了好半天~~如rabbitlzx说的是我能想到的工厂方法的唯一作用。