c# - 我是否正确实现了工厂设计模式?我该如何改进这个架构?
问题描述
我正在尝试使用正确的设计模式和命名方案来提高我的正式编码能力。我有一种情况可以求助。
我正在尝试创建一个全球工厂服务,该服务根据组织在各种数据库文件中的数据构建各种模型。我很想得到一些关于当前结构的反馈,以及我可以做些什么来改进它。
目前我认为我在CataloguesFactory
课堂上做的事情太多了,我想知道在哪里以及如何将它分成组件。此外,我不确定命名方案是否正确......或者即使基本架构是否正确!
当前文件结构:
Catalogues
├── Database
│ ├── Object1Definition.json
│ └── ...
├── Object1Catalogue.cs
└── ...
Models
├── Object1Model.cs
└── ...
Services
└── CataloguesFactory.cs
在Catalogues
文件夹中,我有各种.json
保存对象定义的文件 - 计划最终将这些文件放在在线数据库上,并且能够动态更新数据库的内容,而无需 . 然后将这些定义转换为目录,该目录存储在目录中并由目录引用CataloguesFactory
以构建Models
.
文件本身如下所示:
Object1Definition.json:包含所有对象的基本定义。
{
object1List:
[
{
"slug": "first-object",
"property1": "Lorem",
"property2": 4
},
...
]
}
Object1Catalogue.cs:这是对象从json
格式到cs
格式的转换。其中Item
包含一个ToModel()
函数,该函数接受某种形式的修饰符参数,这将有助于Item
构建 final Model
。
public class Object1Catalogue
{
public class Item
{
public string slug;
public string property1;
public int property2;
public Object1Model ToModel(int modifier)
{
var obj = new Object1Model();
obj.Slug = slug;
obj.Property1 = property1;
obj.Property2 = property2 * modifier;
}
}
public Object1Catalogue.Item[] object1List;
}
Object1Model.cs:这是工厂生成的对象,基于数据库和一些在 Get 请求中输入的修饰符。可以为这些模型提供额外的功能(也许模型在这里也不是正确的后缀)。
public class Object1Model
{
public string Slug;
public string Property1;
public int Property2;
override public string ToString()
{
return $"{Slug}: {Property1} {Property2.ToString()}";
}
}
CataloguesFactory.cs:这是一个服务,也是一个单例。现在它有 3 个职责:(1) 将json
文件转换为列表中的对象,(2) 存储结果对象和 (3) 公开Get
允许外部类构造工厂对象的函数。
public class CataloguesFactory
{
private CataloguesFactory() { Initialize(); }
private static readonly Lazy<CataloguesFactory> lazy = new Lazy<CataloguesFactory>(() => new CataloguesFactory());
public static CataloguesFactory Instance { get => lazy.Value; }
private string DATABASE_PATH = $"{Application.dataPath}/Catalogues/Database";
private Object1Catalogue Object1Catalogue;
...
private void Initialize()
{
Object1Catalogue = StreamData<Object1Catalogue>("Object1Definition.json");
...
}
public Object1Model GetObject1(string slug, int modifier)
{
var obj = Array.Find(Object1Catalogue.object1List, item => item.slug == slug);
return obj.ToModel(modifier);
}
...
private T StreamData<T>(string fileName)
{
string jsonString = File.ReadAllText($"{DATABASE_PATH}/{fileName}");
return JsonUtility.FromJson<T>(jsonString);
}
}
实现:应用程序中的任何地方,我现在都可以调用
Object1Model obj = CataloguesFactory.Instance.GetObject1("first-object", 5);
obj.ToString();
// returns "first-object: Lorem 20";
请让我知道您的想法以及如何改进此结构!
解决方案
推荐阅读
- javascript - GSAP TweenMax 可以空目标错误静默失败吗?
- excel - 如何在以 SQL 形式运行的 Excel 中参数化 ODBC;DSN 和 excel 工作表路径 - (来自其他来源 -> 来自 Microsoft Query)
- authentication - Orbeon Forms(开源 Web 表单解决方案)单点登录身份验证
- java - 这种简单地使用 JTable 默认单元格编辑器来验证文本是行不通的。有人可以帮助理解为什么吗?
- python - Python:数据框对象不可迭代
- php - 我们如何在php中将字符串转换为数组?
- docker - 在 ubuntu 镜像中安装 kotlin 出现错误
- javascript - 限制从 .find() 返回的 div 数量
- firebase - 为什么我的 Cloud Firestore 触发器无法使用 GUI 工作?
- google-app-engine - 如何使用 go 1.11 和 Google App Engine Standard 对私有 Go 模块进行身份验证