模式定义
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。
实现原理
抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且,如果要更换这一系列的产品,则只需要更换一个工厂类即可。
如果客户端需要创建一些产品结构,而这些产品结构又分别属于不同的产品类别,则可以使用抽象工厂模式,抽象工厂模式中抽象工厂类负责定义创建对象的接口,具体这一系列对象的创建工作由实现抽象工厂的具体工厂类来完成。
角色
抽象工厂模式中存在四种角色,分别是抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色。
- 抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
- 具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
- 抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
- 具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
模式结构图
代码示例
class Program
{
static void Main(string[] args)
{
User user = new User();
Department dept = new Department();
IFactory factory = new AccessFactory();
IUser iu = factory.CreateUser();
iu.Insert(user);
iu.GetUser(1);
IDepartment idep = factory.CreateDepartment();
idep.Insert(dept);
idep.GetDepartment(1);
Console.WriteLine("Hello World!");
}
}
public class User
{
public int ID { get; set; }
public int Name { get; set; }
}
public class Department
{
public int ID { get; set; }
public string Name { get; set; }
}
public interface IDepartment
{
void Insert(Department department);
Department GetDepartment(int id);
}
public class SqlServerDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在SQL server中根据ID得到Department表一条记录");
return new Department();
}
public void Insert(Department department)
{
Console.WriteLine("在SQL server中给Department表增加一条记录");
}
}
public class AccessDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在Access中根据ID得到Department表一条记录");
return new Department();
}
public void Insert(Department department)
{
Console.WriteLine("在Access中给Department表增加一条记录");
}
}
public interface IUser
{
void Insert(User user);
User GetUser(int id);
}
public class SQLServerUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("在SQLserver中根据ID得到User表一条记录");
return new User();
}
public void Insert(User user)
{
Console.WriteLine("在SQLserver中给User表增加一条记录");
}
}
public class AccessUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return new User();
}
public void Insert(User user)
{
Console.WriteLine("在Access中给User表增加一条记录");
}
}
public interface IFactory
{
IUser CreateUser();
IDepartment CreateDepartment();
}
public class SQLserverFactory : IFactory
{
public IDepartment CreateDepartment()
{
return new SqlServerDepartment();
}
public IUser CreateUser()
{
return new SQLServerUser();
}
}
public class AccessFactory : IFactory
{
public IDepartment CreateDepartment()
{
return new AccessDepartment();
}
public IUser CreateUser()
{
return new AccessUser();
}
}