技术内容
文章技术内容讲解部分转载http://www.cnblogs.com/zhili/p/SimpleFactory.html
理解
我感觉简单工厂模式可以理解为一个类中函数的抽象。
以上面给出的代码为例,在不使用这种简单工厂模式的设计方法中,Customer类中的得到食物的方法为
public static Food Cook(string type)
{
Food food = null;
if (type.Equals("西红柿炒蛋"))
{
food = new TomatoScrambledEggs();
}
else if (type.Equals("土豆肉丝"))
{
food = new ShreddedPorkWithPotatoes();
}
return food;
}
而使用了简单工厂模式后,这部分任务就完全由工厂类中的静态函数来完成
public class FoodSimpleFactory
{
public static Food CreateFood(string type)
{
Food food = null;
if (type.Equals("土豆肉丝"))
{
food= new ShreddedPorkWithPotatoes();
}
else if (type.Equals("西红柿炒蛋"))
{
food= new TomatoScrambledEggs();
}
return food;
}
}
所以,简单工厂的模式的好处就是1.隔离(好像没有那么厉害吧…;如果需要增加各种不同的“菜”的话,在Customer类中会修改那个函数,而在工厂类中同样需要修改这个函数)2.代码复用,我感觉这个优点要远远大于另外一个优点:比如数据库的操作函数,可以都放在工厂类中,由工厂类提供统一的函数的集合的入口(好像又不仅仅是简单工厂模式了…)。这样在一个工程中的不同的部分都可以采用这个功能类中的不同的部分了。
我自己构想的一个应用场景如下:
我构建了一个主窗口,这个主窗口需要对n类不同格式的源数据进行标准格式化(也许还要进行标准的处理)通过combobox选择不同格式的数据源
public class FormatFactory
{
public static 数据抽象基类 FormatNormalize( 参数 )
{
数据抽象基类 normalizedFormat = null;
switch(参数)
{
case 参数1:
normalizedFormat = new 格式1();
...
default:
break;
}
}
}
这样,显示主窗口就获得了第几个格式的类,然后每个格式的类中都有自己的标准格式操作。
这样操作后,主窗口类可以将注意力完全集中在显示上,而不处理任何操作逻辑了。但是,整个项目的权重就很大部分压在这个简单工厂类中了。确实是这样的,这就变成了“咽喉要道”了。(这个有问题,整个功能没有办法再往下行进哪怕一点点)
与简单工厂模式相对应的是工厂模式:其实就是在工厂模式的基础上又包了一层:原来是Custormer类中直接定义一个函数,函数直接产生Food;在简单工厂模式中,包了一层Factory类,在该类中的方法中产生Food;在工厂模式中,首先对Factory类进行抽象,然后进行对每个产品构造对应的工厂:也就是说包了两层:一层抽象工厂,一层抽象产品。
更进一层的是抽象工厂模式:我感觉抽象工厂模式是工厂模式的一个简单的扩展,也就是工厂模式中工厂所要处理的是一个产品(一个基类下的一一系列不同的子类);而抽象工厂则在工厂的抽象基类中就定义了不同的基类下不同产品的方法。这样生成的不同的工厂子类就具备了产生这几个不同基类的产品的能力。简单说,工厂模式一对一;抽象工厂模式一对多。这种不同主要来源于抽象工厂基类的定义不同。