电の岁月---点滴记忆
交流,分享,进步

定义:

专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(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()

posted on 2010-08-11 20:22  doucontorl  阅读(240)  评论(0编辑  收藏  举报