定义:
专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。
意图:
提供一个类,由它负责根据一定的条件创建某一具体类的实例
优点:
- 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来。
- 外界与具体类隔离开来,耦合性低。
- 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
缺点:
虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。
应用场合:
- 工厂类负责创建的对象比较少
- 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心
例子:计算加减乘除的对话框操作
PS. 为了凸显代码,本例并没有把各个类独立出来,有点不符合逻辑..
之前:
namespace simple
{
public partial class Form1 : Form
{
public interface operation
{
int operate(int a,int b);
}
public Form1()
{
InitializeComponent();
}
public class add : operation
{
public int operate(int a, int b)
{
return a + b;
}
}
public class sub : operation
{
public int operate(int a, int b)
{
return a - b;
}
}
private void button1_Click(object sender, EventArgs e)
{
if (comboBox1.Text == "+")
{
add a = new add();
textBox3.Text=a.operate(Int32.Parse(textBox1.Text), Int32.Parse(textBox2.Text)).ToString();
}
else if (comboBox1.Text == "-")
{
sub s = new sub();
textBox3.Text = s.operate(Int32.Parse(textBox1.Text), Int32.Parse(textBox2.Text)).ToString();
}
}
}
}
之后:(简单工厂模式)
namespace simple
{
public partial class Form1 : Form
{
public interface operation
{
int operate(int a,int b);
}
public Form1()
{
InitializeComponent();
}
public class add : operation
{
public int operate(int a, int b)
{
return a + b;
}
}
public class sub : operation
{
public int operate(int a, int b)
{
return a - b;
}
}
public class Factory
{
public operation getore(string s)
{
switch(s)
{
case "+":
return new add();
case "-":
return new sub();
default:
return null;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
Factory f = new Factory();
textBox3.Text=f.getore(comboBox1.Text).operate(Int32.Parse(textBox1.Text),Int32.Parse(textBox2.Text)).ToString();
}
}
}
综合而言,优势不是很明显,工厂模式的一个优点有所体现,使用之前需要在客户端不断的添加新的对象,然后CTRL+C和CTRL+V的复制代码,在工厂模式中就直接用一句代码“自动”的选择所用的对象和方法了。
如果需要修改“+”“-”等元素的话,需要在客户端修改相应的代码(或增添),但是使用工厂模式以后,客户端的代码不需要更改,能达到实时的作用..
当然也还有更多需要改进的地方...必须我们可以采用配置文件或者xml语句等替代switch()