设计模式--工厂方法和抽象工厂

这两个我觉得挺类似的,然后仔细了解下才发现具体区别。

工厂方法:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使得一个类的实例化延迟到其子类。

抽象工厂:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。

区别:

工厂方法返回单个对象的接口,而抽象工厂返回的是一系列相关对象的接口。

工厂方法:

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返回的是单个方法的接口。

原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6726054.html