不得不懂的C#设计模式学习(三)-抽象工厂模式
直接进入Subject.
抽象工厂模式(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
四个角色
抽象工厂(Abstract Factory)角色:这是工厂方法模式的核心,它与应用系统商业逻辑无关。
具体工厂(Concrete Factory)角色:直接在客户端的调用下创建具体的实例。包含了选择合适的具体对象,而这个逻辑与应用系统的商业逻辑紧密相关。
抽象产品(Abstract Product)角色:工厂方法模式所创建的对象的父类,或它们直接拥有的接口。
具体产品(Concrete Product)角色:代表具体的产品。
例子
留一个问题,看完例子给出UML图(可以贴出)。
public class User //增加User用户类 { public int _id; public int Id { get { return _id; } set { _id = value; } } public string _name; public string Name { get { return _name; } set { _name = value; } } } public class Department //增加部门Department类 { private int _id; public int Id { get { return _id; } set { _id = value; } } private string _deptNmae; public string DeptName { get { return _deptNmae; } set { _deptNmae = value; } } } interface IUser { void Insert(User user); User GetUser(int id); } 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; } } 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("在SQL Server中给Department表增加了一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在SQL Server中根据id得到了Department表的一条记录"); return null; } } class AccessDepartment : IDepartment { public void Insert(Department department) { Console.WriteLine("在Accessz中给Department表增加了一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在Access中根据id得到了Department表的一条记录"); return null; } } interface IFactory { IUser CreateUser(); IDepartment CreateDepartment(); } class SqlServerFactory : IFactory { public IUser CreateUser() { return new SqlserverUser(); } public IDepartment CreateDepartment() { return new SqlserverDepartment(); } } class AccessFactory : IFactory { public IUser CreateUser() { return new AccessUser(); } public IDepartment CreateDepartment() { return new AccessDepartment(); } }
static void Main(string[] args) { User user = new User(); Department dpt = new Department(); IFactory facatory = new AccessFactory(); IUser iu = facatory.CreateUser(); iu.Insert(user); iu.GetUser(1); IDepartment id = facatory.CreateDepartment(); id.Insert(dpt); id.GetDepartment(1); Console.ReadKey(); }
总结
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,运用抽象工厂模式的关键点在于应对"多系列对象创建"的需求变化,学会了抽象工厂模式,你将理解OOP的精华:面向接口对象。