抽象工厂模式定义:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
主要意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:接口选择的问题。
解决方案:在一个产品族里面,定义多个产品。
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
抽象工厂类图:
代码实现:
using System;
namespace _02抽象工厂模式_工厂方法模式数据访问
{
class Program
{
static void Main(string[] args)
{
User user = new User();
IFactory factory = new AccessFactory();
IUser iu = factory.CreateUser();
iu.Insert(user);
iu.GetUser(1);
Console.Read();
}
}
//用户类
class User
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
//用户接口
interface IUser
{
void Insert(User user);
User GetUser(int id);
}
//用于访问SQL的User
class SqlserverUser : IUser
{
public void Insert(User user)
{
Console.WriteLine("在SQL Server中给User表中增加一条记录");
}
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
//用于访问Access的User
class AccessUser : IUser
{
public void Insert(User user)
{
Console.WriteLine("在Access中给User表增加一条记录");
}
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return null;
}
}
//创建访问User表对象的抽象的工厂接口
interface IFactory
{
IUser CreateUser();
}
//实现IFactory接口,实例化SqlserverUser
class SqlServerFactory:IFactory
{
public IUser CreateUser()
{
return new SqlserverUser();
}
}
//实现IFactory接口,AccessUser
class AccessFactory:IFactory
{
public IUser CreateUser()
{
return new AccessUser();
}
}
}
总结:
1,抽象工厂模式主要是用于创建一组相关联的产品,业务代码层不需要关心具体的产品实现类。
2,抽象工厂模式适用于需要一组对象共同完成某种功能,或者多组对象完成不同功能的情况。
3,抽象工厂中生成的是一整套产品,而工厂方法模式中生成的单一的产品。