注册
|
登录
发帖
热搜
活动
交友
discuz
论坛
BBS
翼度工具
翼度网址导航
开发工具
Linux命令速查
网页设计配色表
在线制作icon
颜色代码选取器
翼度科技
»
论坛
›
编程开发
›
.net
›
查看内容
返回列表
发新帖
再有人问你抽象工厂设计模式,把这篇文章丢给他
梦萦山水
梦萦山水
当前离线
积分
15
5
主题
5
帖子
15
积分
新手上路
新手上路, 积分 15, 距离下一级还需 35 积分
新手上路, 积分 15, 距离下一级还需 35 积分
积分
15
发消息
显示全部楼层
概述
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一组产品。抽象工厂模式定义如下:
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
描述需求
分别往SQLserver、mysql、sqliter数据库中添加用户和部门数据。
抽象工厂实现代码
/// <summary>
/// 顶层抽象工厂
/// </summary>
public interface IFacatory
{
IDatabaseUser GetDatabaseUser();
IDatabaseDepartment GetDatabaseDepartment();
}
/// <summary>
/// 具体工厂
/// </summary>
public class SqlliteFacatory : IFacatory
{
public IDatabaseDepartment GetDatabaseDepartment()
{
return new SqlliteDepartment();
}
public IDatabaseUser GetDatabaseUser()
{
return new SqliteUser();
}
}
/// <summary>
/// 具体工厂
/// </summary>
public class MysqlFacatory : IFacatory
{
public IDatabaseDepartment GetDatabaseDepartment()
{
return new MysqlDepartment();
}
public IDatabaseUser GetDatabaseUser()
{
return new MysqlUser();
}
}
/// <summary>
/// 具体工厂
/// </summary>
public class SqlserverFacatory : IFacatory
{
public IDatabaseDepartment GetDatabaseDepartment()
{
return new SqlServerDepartment();
}
public IDatabaseUser GetDatabaseUser()
{
return new SqlServerUser();
}
}
复制代码
/// <summary>
/// 用户类
/// </summary>
public class User
{
public string Name { get; set; }
public int Id { get; set; }
}
/// <summary>
/// 抽象的产品
/// </summary>
public interface IDatabaseUser
{
void InsertUser(User user);
User GetUser(int id);
}
/// <summary>
/// 具体的产品
/// </summary>
public class SqlServerUser: IDatabaseUser
{
public void InsertUser(User user)
{
Console.WriteLine($"插入了SqlServerUser:{user.Name}");
}
public User GetUser(int id)
{
Console.WriteLine($"获取了Id:{id}的用户");
return null;
}
}
/// <summary>
/// 具体的产品
/// </summary>
public class MysqlUser : IDatabaseUser
{
public void InsertUser(User user)
{
Console.WriteLine($"插入了MysqlUser:{user.Name}");
}
public User GetUser(int id)
{
Console.WriteLine($"获取了Id:{id}的用户");
return null;
}
}
/// <summary>
/// 具体的产品
/// </summary>
public class SqliteUser : IDatabaseUser
{
public void InsertUser(User user)
{
Console.WriteLine($"插入了SqliteUser:{user.Name}");
}
public User GetUser(int id)
{
Console.WriteLine($"获取了Id:{id}的用户");
return null;
}
}
复制代码
/// <summary>
/// 部门类
/// </summary>
public class Department
{
public string Name { get; set; }
public int Id { get; set; }
}
/// <summary>
/// 抽象的产品
/// </summary>
public interface IDatabaseDepartment
{
void InsertDepartment(Department department);
Department GetDepartment(int id);
}
/// <summary>
/// 具体的产品
/// </summary>
public class SqlServerDepartment : IDatabaseDepartment
{
public void InsertDepartment(Department department)
{
Console.WriteLine($"插入了SqlServerDepartment部门:{department.Name}");
}
public Department GetDepartment(int id)
{
Console.WriteLine($"获取了Id:{id}的部门");
return null;
}
}
/// <summary>
/// 具体的产品
/// </summary>
public class MysqlDepartment : IDatabaseDepartment
{
public void InsertDepartment(Department department)
{
Console.WriteLine($"插入了MysqlDepartment部门:{department.Name}");
}
public Department GetDepartment(int id)
{
Console.WriteLine($"获取了Id:{id}的部门");
return null;
}
}
/// <summary>
/// 具体的产品
/// </summary>
public class SqlliteDepartment : IDatabaseDepartment
{
public void InsertDepartment(Department department)
{
Console.WriteLine($"插入了SqlliteDepartment部门:{department.Name}");
}
public Department GetDepartment(int id)
{
Console.WriteLine($"获取了Id:{id}的部门");
return null;
}
}
复制代码
//C#控制台调用
Console.WriteLine("抽象工厂");
User user = new();
user.Name = "mhg";
user.Id = 1;
//变化点
IFacatory facatory=new SqlserverFacatory(); //MysqlFacatory //SqlliteFacatory
IDatabaseUser databaseUser = facatory.GetDatabaseUser();
databaseUser.InsertUser(user);
databaseUser?.GetUser(user.Id);
Department department = new Department();
department.Name = "研发部";
department.Id = 2;
IDatabaseDepartment databaseDepartment= facatory.GetDatabaseDepartment();
databaseDepartment.InsertDepartment(department);
databaseDepartment?.GetDepartment(department.Id);
复制代码
以上就用抽象工厂实现的全部代码,该代码中IFacatory做为抽象工厂,SqlserverFacatory、MysqlFacatory、SqliteFacatory作为具体的产品工厂来生产产品;IDatabaseUser和IDatabaseDepartment为抽象的产品分别生产具体的产品SqlServerUser、MysqlUser、SqliteUser和SqlServerDepartment、MysqlDepartment、SqlliteDepartment。
总结
这个需求也可以用工厂模式实现,但每增加一个产品,就必须增加一个工厂类,而用抽象工厂可以缩减创建子类工厂的数量,不必给每一个产品增加工厂类,可以对产品进行分组,每组中的不同产品由同一个工厂类的不同方法来创建。
来源:
https://www.cnblogs.com/mhg215/archive/2023/02/16/17122301.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
上一篇:
ASP.NET Core - 请求管道与中间件
下一篇:
C# Newtonsoft增删改查(本地存储)(简单便捷)(拿来即用)
发表于 2023-2-16 09:24:21
举报
回复
使用道具
分享
返回列表
发新帖
本版积分规则
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
快速回复
快速回复
返回顶部
返回顶部
返回列表
返回列表