简单工厂:
拿我们的简单三层举例子
先定义dal层
class Dal
{
public void Delete()
{
}
}
工厂类
class Factory
{
//这样掉的好处是 当dal层发生变化的时候不需要去每个调用的地方修改对应的实例,只需要在工厂里面修改对应的实例就行。
//例如Dal的名字换成DAL 这个时候只需要改动工厂里面对应的实例名称即可。
public static Dal CreateInstance()
{
return new Dal();
}
}
在BLL层中实例化Dal层对象
class Bll
{
Dal dal = Factory.CreateInstance();
}
这样的好处是当dal层名称发生变化时,只需要改动一处即可,调用者无需关系调用的对象!
优点:可以提高程序的扩展性,减少修改量!
抽象工厂(一般配合反射或者配置文件来用):
场景我们的系统要同时支持两个数据库 SqlServer 跟Oracle数据库 并且不同的环境要进行随时切换。
看下面的代码:
interface ISqlServer
{
//数据库添加操作
public void Add();
}
interface IOracle
{
//数据库添加操作
public void Add();
}
class SqlServer : ISqlServer
{
public void Add()
{
Console.WriteLine("SqlServer添加操作");
}
}
class Oracle : IOracle
{
public void Add()
{
Console.WriteLine("Oracle添加操作");
}
}
class SqlServerFactory : AbstractFactory
{
public ISqlServer GetSqlServer()
{
return new SqlServer();
}
}
class OracleFactory : AbstractFactory
{
public IOracle GetOracle()
{
return new Oracle();
}
}
interface AbstractFactory
{
public ISqlServer GetSqlServer();
public IOracle GetOracle();
}
static void Main(string[] args)
{
//调用的场景
AbstractFactory sqlServer = new SqlServerFactory();
sqlServer.GetSqlServer().Add();
AbstractFactory oracleServer = new OracleFactory();
sqlServer.GetOracle().Add();
}
这样调用还是觉得有点麻烦,我们可以用反射来实例化对象。 我们在来完善一下AbstractFactory。
public abstract AbstractFactory
{
public static AbstractFactory GetInstance()
{
string factoryName = System.Configuration.ConfigurationManager.AppSettings["factoryName"];
AbstractFactory instance;
if (factoryName != "")
instance = (AbstractFactory)Assembly.Load(factoryName).CreateInstance(factoryName);
else
instance = null;
return instance;
}
public abstract ISqlServer GetSqlServer();
public abstract IOracle GetOracle();
}
//调用
static void Main(string[] args)
{
AbstractFactory.GetInstance().GetOracle().Add();
AbstractFactory.GetInstance().GetSqlServer().Add();
}
//配置config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="factoryName" value="SqlServerFactory"></add>
</appSettings>
</configuration>