工厂模式特点:
- 提供了一种创建对象的最佳方式,创建对象时不会对客户端暴露创建逻辑,通过使用一个共同的接口来指向新创建的对象
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
使用场景:
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
最简单实现:
class Program { static void Main(string[] args) { //通过参数来实例化子类。 IVehicle vehicle1 = FactoryVehicle.CreateVehicle("boat"); vehicle1.go(); IVehicle vehicle2 = FactoryVehicle.CreateVehicle("car"); vehicle2.go(); Console.ReadKey(); } } //创建一个工厂,生成基于给定信息的实体类的对象 public class FactoryVehicle { public static IVehicle CreateVehicle(string VehicleName) { switch (VehicleName.ToLower()) { case "car": return new Car(); case "boat": return new Boat(); default: return new Car(); } } } //创建一个接口 public interface IVehicle { void go(); } #region 创建实现接口的实体类 public class Boat : IVehicle { public void go() { Console.WriteLine("this is a boat"); } } public class Car : IVehicle { public void go() { Console.WriteLine("this is a car"); } } #endregion
运行结果:
复杂实现:
namespace 工厂模式 { class Program { static void Main(string[] args) { User user = new User(); Department dept = new Department(); IFactory factory = new SqlServerFactory(); //IFactory factory = new AccessFactory(); IUser iu = factory.CreateUser(); iu.Insert(user); iu.GetUser(1); IDepartment id = factory.CreateDepartment(); id.Insert(dept); id.GetDepartment(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; } } } 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; } } 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(); } } }
打印结果:
实例化SqlServerFactory时:
实例化AccessFactory 时: