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

参考http://www.cnblogs.com/yuyijq/archive/2007/10/06/915185.html

  http://www.cnblogs.com/zhenyulu/articles/36885.html

 

//抽象工厂类
namespace WindowsFormsApplication4
{
public abstract class ComputerOperation
{
public abstract XP CreateXP();
public abstract Linux CreateLinux();
}
}

 

//具体工厂类Windows.cs
namespace WindowsFormsApplication4
{
public class Windows:ComputerOperation
{
public override XP CreateXP()
{
return new WindowsXP();
}
public override Linux CreateLinux()
{
return new WindowsLinux();
}
}
}

 

namespace WindowsFormsApplication4
{
//具体工厂类Mac.cs
public class Mac:ComputerOperation
{
public override XP CreateXP()
{
return new MacXP();
}
public override Linux CreateLinux()
{
return new MacLinux();
}
}
}

 

//基类XP.cs
namespace WindowsFormsApplication4
{
public abstract class XP
{
public abstract string showxp();
}
}
//基类Linux.cs
namespace WindowsFormsApplication4
{
public abstract class Linux
{
public abstract string linuxshow();
}
}

 

//具体工厂类
namespace WindowsFormsApplication4
{
public class WindowsXP:XP
{
public override string showxp()
{
return "u r using Windows XP Operation!";
}
}
}
namespace WindowsFormsApplication4
{
class WindowsLinux : Linux
{
public override string linuxshow()
{
return "u r using Windows Linux Operation!";
}
}
}
namespace WindowsFormsApplication4
{
public class MacXP : XP
{
public override string showxp()
{
return "u r using Mac XP Operation!";
}
}
}
namespace WindowsFormsApplication4
{
public class MacLinux : Linux
{
public override string linuxshow()
{
return "u r using Mac Linux Operation!";
}
}
}

客户端代码:

private void button1_Click(object sender, EventArgs e)
{
string str = "";
ComputerOperation co
= new Windows();
XP xp
= co.CreateXP();
str
+= xp.showxp();
MessageBox.Show(str);
}

 

改为以反射为手段的抽象工厂模式..

//抽象工厂类
namespace WindowsFormsApplication4
{
public class ComputerOperation
{
//public abstract XP CreateXP();
// public abstract Linux CreateLinux();
private string _xp;
private string _linux;
public ComputerOperation(string type)
{
_xp
= string.Format("WindowsFormsApplication4.{0}XP", type);
_linux
= string.Format("WindowsFormsApplication4.{0}Linux", type);
}
public XP CreateXP()
{
return (XP)helper(_xp);
}
public Linux CreateLinux()
{
return (Linux)helper(_linux);
}
private object helper( string classname)
{
return Assembly.Load("WindowsFormsApplication4").CreateInstance(classname);
}
}

}

除去了Window.cs和Mac.cs类

客户端代码变为:

private void button1_Click(object sender, EventArgs e)
{
string str = "";
//ComputerOperation co = new Windows();
//XP xp = co.CreateXP();
//str += xp.showxp();
ComputerOperation co = new ComputerOperation("Windows");
str
= co.CreateXP().show();
MessageBox.Show(str);
}

抽象工厂模式比较适用于后台数据库的切换,如从Orcal到SQL Server的切换,如果适用配置文件和反射的话,只需要更改配置文件即可!
posted on 2010-08-11 20:22  doucontorl  阅读(200)  评论(0编辑  收藏  举报