工作中,我们时常接触到switch...case...项目需求,
但是随着需求的变化,case条件可能会慢慢无预料地增多,因此....
现在正在学习设计模式,想通过"工厂模式"来替代switch...case...
大致的意思是:switch(id)
{
    case "1":
       create1();
       ....
    case "2":
       create2();
       ...
    case "3":
       create3();
       ...
}想通过建一个Factory类来实现,只需要:
Factory f = new Factory(id);
f.create();
....
请大家支持解决方案与思路。因惑:
把id设为构造函数的参数,但是不通过if...似乎又很难整出来,
也许还是面向对像的习惯没陪养出来。

解决方案 »

  1.   

    switch不一定要用工厂来替换,状态,职责链都有可能
    还是具体要分析,switch要干什么
      

  2.   

    sunrobust(咸鱼) ( ) 信誉:100    Blog  2007-03-01 11:13:00  得分: 0  
     
     
       可以把这种耦合放到配置文件当中,系统启动时读取配置文件,创建相应的对象
      
     
    ----------------
    你说的好像一本设计模式书的,哈哈
    ---------------------------------------
    目前,条件id是无法知道到底是"1",还是"2".....
    只需要把条件id传给构造函数,
    然后类对像自动处理!以前也遇到过这样的面试题,
      

  3.   

    好像设计模式有一个Prototype模式,我觉得是不是更适合楼主说的情况?
    我这样想的:
    Abstract Class Case
    {
        Abstract void Creat();
    }//////////////////////////////
    public Class Caes1:Case
    {
        override void Creat()
        {
            .....
        }
    }////////////////////////////////////////////////public void PrototypeSwitch(Case c)
    {
        c.Create();
    }不知道这样是否可以,是否是Prototype模式
      

  4.   

    to:LiCeRForDream() 这个参数条件id怎么传过去??关键是id应作为类的构造函数的一个参数,而不用if...else if...
      

  5.   

    LiCeRForDream的用法,其实就是根据你最终(客户端)的需求, PrototypeSwitch(Case1)或者 PrototypeSwitch(Case2)....,由客户端决定具体实例话那个Case的子类。
    --------
    我认为,Factory Method,实际就是在一个Factory接口之上,派生出N多的子Factory,每个子Factory对应一个CreateCase(),调用时,客户端去决定调用那个子Factory。
    Gof中,Factory Method的定义是:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
      

  6.   

    skywind_jk(天风) 的回复有一定的道理,
    不过,有一点我想不通的是:
    如何据case条件来实类化那个相应的类呢?
      

  7.   

    可以把这种耦合放到配置文件当中,系统启动时读取配置文件,创建相应的对象-------------------------------------------------------可以看看IOC模式,它算是解耦比较好的了,很多IOC的框架都在XML配置文件中进行类的配置.
      

  8.   

    MyClass myClass = (MyClass)Class.forName("XXXXXX").newInstance();
      

  9.   

    所有的类需要继承自同一个接口
    客户应用程序仅对接口进行操作Factory Class根据传入的字符串,创建接口的不同子类
      

  10.   

    但是总有个地方要作类似于case的操作吧!