这两个我觉得挺类似的,然后仔细了解下才发现具体区别。
工厂方法:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使得一个类的实例化延迟到其子类。
抽象工厂:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。
区别:
工厂方法返回单个对象的接口,而抽象工厂返回的是一系列相关对象的接口。
工厂方法:
public class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public virtual double GetResult()
{
double result = 0;
return result;
}
}
public class OperationAdd:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
public class OperationSub:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
public class OperationMul:Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
public class OperationDiv:Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
throw new Exception("除数不能为0");
result = NumberA / NumberB;
return result;
}
}
//定义工厂接口
interface IFactory
{
Operation CreateOperation();
}
//实现具体工厂
class AddFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
class SubFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
class MulFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationMul();
}
}
class DivFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationDiv();
}
}
抽象工厂:
class User
{
public int Id { get; set; }
public string Name { get; set; }
}
interface IUser
{
void Insert(User user);
User GetUser(int id);
}
//不同数据库类实现接口
class SqlUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("sql获取一条id=" + id + "的记录");
return null;
}
public void Insert(User user)
{
Console.WriteLine("sql添加一天记录:" + user.Id + " " + user.Name);
}
}
class AccessUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("access获取一条id=" + id + "的记录");
return null;
}
public void Insert(User user)
{
Console.WriteLine("access添加一天记录:" + user.Id + " " + user.Name);
}
}
//根据不同db创建不同db的实现对象(反射+配置文件实现数据库访问)
//添加配置文件结点
<appSettings>
<add key="DB" value="Sql"/>
</appSettings>
//添加创建对象类
class CreateByDB
{
static readonly string db = ConfigurationManager.AppSettings["DB"];//获取配置文件数据库类型名称
static string AssemblyName = "抽象工厂模式3";//程序集名称
public static IUser CreateUser()
{
string className = AssemblyName + "." + db + "User";
return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);//根据程序集和类名创建具体类型
}
}
调用:
User user = new User() { Id = 5, Name = "name5" };
IUser iu = CreateByDB.CreateUser();//这里就会根据配置文件的数据库名称创建对应的实例
iu.Insert(user);
iu.GetUser(6);
//要切换数据库只需修改配置文件。前提多个数据库的实现都得提前写好。比如还有其他数据库 orical,得把orical实现IUser的类写好。
//区别重点就在于 IUser,返回的是一系列相关对象的接口。而工厂方法里的Operation返回的是单个方法的接口。