设计模式<2>------工厂模式和抽象工厂模式------创建型

时间:2023-03-09 00:29:39
设计模式<2>------工厂模式和抽象工厂模式------创建型

简单工厂:

设计模式<2>------工厂模式和抽象工厂模式------创建型

拿我们的简单三层举例子

先定义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层名称发生变化时,只需要改动一处即可,调用者无需关系调用的对象!

优点:可以提高程序的扩展性,减少修改量!

抽象工厂(一般配合反射或者配置文件来用):

设计模式<2>------工厂模式和抽象工厂模式------创建型

场景我们的系统要同时支持两个数据库  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>