大话设计模式-抽象工厂模式

抽象工厂模式

抽象工厂模式提供一个创建一系列相关或互相依赖的接口,而无需再指定他们具体的类。

最大的好处是易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得非常容易,他只需要改变具体工厂即可使用不同的产品配置。

他让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。


访问数据库

数据类:User/Department

class User{
    public int ID { get; set; }
    public string Name { get; set; }
}
class Department{
    public int ID { get; set; }
    public string Name { get; set; }
}

数据接口:IUser/IDepartment

用于客户端访问,解除与具体数据库访问的耦合。

interface IUser{
    void Insert(User user);
    void GetUser(int id);
}
interface IDepartment{
    void Insert(Department department);
    void GetDepartment(int id);
}

接口实现类:MySQL/SQLServer User/Department

分别实现MySQL和SQLServer两种数据库的对用户表和部门表的数据操作。每种表的操作封装在一个类中。

class SQLServerUser : IUser
{
    public void Insert(User user) => Console.WriteLine("在SQLServer中给User表插入一条记录");
    public void GetUser(int id) => Console.WriteLine("在SQLServer中根据ID查询User表得到一条记录");
}
class MySQLUser : IUser
{
    public void Insert(User user) => Console.WriteLine("在MySQL中给User表插入一条记录");
    public void GetUser(int id) => Console.WriteLine("在MySQL中根据ID查询查询User表得到一条记录");
}
class SQLServerDepartment : IDepartment
{
    public void Insert(Department department) => Console.WriteLine("在SQLServer中给Department表插入一条记录");
    public void GetDepartment(int id) => Console.WriteLine("在SQLServer中根据ID查询Department表得到一条记录");
}
class MySQLDepartment : IDepartment
{
    public void Insert(Department department) => Console.WriteLine("在MySQL中给Department表插入一条记录");
    public void GetDepartment(int id) => Console.WriteLine("在MySQL中根据ID查询Department表得到一条记录");
}

工厂接口:IFactory

声明了创建不同数据库都要实现的方法

interface IFactory
{
    IUser CreateUser();
    IDepartment CreateDepartment();
}

具体工厂类:MySQL/SQLServer Factory

为不同数据库创建对应的对表的操作封装的类的实例。

class SQLServerFactory : IFactory{
    public IUser CreateUser() => new SQLServerUser();
    public IDepartment CreateDepartment() => new SQLServerDepartment();
}
class MySQLFactory : IFactory{
    public IUser CreateUser() => new MySQLUser();
    public IDepartment CreateDepartment() => new MySQLDepartment();
}

测试类:Program

//声明工厂,选择SQLServer工厂
IFactory factory = new SQLServerFactory();
//声明用户数据类,创建SQLServer的封装了创建对用户表操作的类的实例
User user = new User();
IUser iuser = factory.CreateUser();
//执行类中封装的对用户表操作的方法
iuser.Insert(user);
iuser.GetUser(1);
//部门数据类同上
Department department = new Department();
IDepartment idepartment = factory.CreateDepartment();
idepartment.Insert(department);
idepartment.GetDepartment(1);
//测试结果
在SQLServer中给User表插入一条记录
在SQLServer中根据ID查询User表得到一条记录
在SQLServer中给Department表插入一条记录
在SQLServer中根据ID查询Department表得到一条记录

猜你喜欢

转载自www.cnblogs.com/errornull/p/10060193.html
今日推荐