AbstractProductA和AbstractProductB是两个抽象的产品,之所以为抽象,是因为它们都有可能有两种不同的实现。而ProductA1、ProductA2和ProductB1、ProductB2就是对两个抽象产品的具体分类的实现。
IFactory是一个抽象工厂的接口,它里面应该包括所有产品创建的抽象方法。而ConcreteFactory 1和ConcreteFactory 2就是具体的工厂了。
通常在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端使用不同的具体工厂。
因为客户的需求使用不同的数据库来存储,所以这里为了保证每次更换使用不同的数据库避免改动大规模的修改代码
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; } } }
class Department { private int _id; public int ID { get { return _id; } set { _id = value; } } private string _deptName; public string DeptName { get { return _deptName; } set { _deptName = value; } } }
interface IUser { void Insert(User user); User GetUser(int id); }
class SqlserverUser : IUser { public void Insert(User user) { Console.WriteLine("在Sqlserver中给User表增加一条记录"); } public User GetUser(int id) { Console.WriteLine("在Sqlserver中根据ID得到User表一条记录"); return null; } }
class AccessUser : IUser { public void Insert(User user) { Console.WriteLine("在Access中给User表增加一条记录"); } public User GetUser(int id) { Console.WriteLine("在Access中根据ID得到User表一条记录"); return null; } }
interface IDepartment { void Insert(Department department); Department GetDepartment(int id); }
class SqlserverDepartment : IDepartment { public void Insert(Department department) { Console.WriteLine("在Sqlserver中给Department表增加一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录"); return null; } }
class AccessDepartment : IDepartment { public void Insert(Department department) { Console.WriteLine("在Access中给Department表增加一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在Access中根据ID得到Department表一条记录"); return null; } }
class DataAccess { private static readonly string AssemblyName = "抽象工厂模式"; private static readonly string db = ConfigurationManager.AppSettings["DB"]; public static IUser CreateUser() { string className = AssemblyName + "." + db + "User"; return (IUser)Assembly.Load(AssemblyName).CreateInstance(className); } public static IDepartment CreateDepartment() { string className = AssemblyName + "." + db + "Department"; return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className); } }
如何读者亲自实践的话,需要添加引用(右键属性--添加--选择红框中的。单击确定)
1、封装性,每个产品的实现类不是高层模块要关心的。
2、产品族内的约束为非公开状态。
1、产品族扩展非常困难。
一个对象族或是一组没有任何关系的对象都有相同的约束,则可以使用抽象工厂模式。