简单工厂模式(Simple Factory Pattern)根据提供给它的参数,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,而且根据不同的参数进行了优化。简单工厂模式实际上不属于23个GoF模式,但它可以作为工厂方法模式的一个引导。

        考虑一个简单的例子,在它里面用到了Factory 类。假设我们有一个输入窗体,允许用户输入他的姓名,可以是“firstname lastname”形式或“lastname,firstname”形式。现在进一步简化这个问题,假设我们总是能通过判断lastname和firstname之间是否有逗号来确定姓名的顺序。

        我们这里用它说明工厂如何工作以及工厂能生成哪些对象。先定义一个简单的类,它用构造函数接收表示名字的字符串,并且可以从类中取回名字。

C#设计模式 - 简单工厂模式(Simple Factory Pattern)   //Base class for getting split names
C#设计模式 - 简单工厂模式(Simple Factory Pattern)
    public class Namer     
    }
 
          注意,在这个基类里没有设置名字的构造函数。

          接下来编写两个非常简单的派生类,它们实现了接口,并在构造函数中将名字分成了两部分。
          在FirstFisrt类中,做了一个简单的假设:最后一个空格前面的所有部分都属于firstname。

C#设计模式 - 简单工厂模式(Simple Factory Pattern)public class FirstFirst : Namer
}


         在LastFirst类里.用逗号给lastname划分界限。当空格或逗号不存在时,两个类里都提供了错误校正处理。

C#设计模式 - 简单工厂模式(Simple Factory Pattern)    public class LastFirst : Namer
    }

        现在很容易给出简单工厂类。只检测逗号是否存在,然后返回其中的一个类的实例。

C#设计模式 - 简单工厂模式(Simple Factory Pattern)    public class NameFactory     
    }

        接下来看看怎样把上述部分组合在一起。为了响应按钮单击事件,用—个NameFactory实例返回正确的派生类。

C#设计模式 - 简单工厂模式(Simple Factory Pattern)        private void btCompute_Click(object sender, System.EventArgs e) 
        }


         然后调用getFrname方法和getLname方法获得正确拆分的名字。这里不需要知道使用的是哪一个派生类,工厂为我们提供了这个类,所需要知道的就是它有两个取出(get)方法。完整的类图如下图所示:


                       C#设计模式 - 简单工厂模式(Simple Factory Pattern)


         这就是简单工厂模式的基本原理。创建了—个抽象工厂,它决定返回哪一个类的实例并将该实例返回。接下来可以调用那个类实例的方法,但不需要知道具体使用的是哪一个子类,这种方法把和数据相关的问题与类的其他方法分隔开来。

相关文章: