首页 > 解决方案 > 我是否正确实现了工厂设计模式?我该如何改进这个架构?

问题描述

我正在尝试使用正确的设计模式和命名方案来提高我的正式编码能力。我有一种情况可以求助。

我正在尝试创建一个全球工厂服务,该服务根据组织在各种数据库文件中的数据构建各种模型。我很想得到一些关于当前结构的反馈,以及我可以做些什么来改进它。

目前我认为我在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";

请让我知道您的想法以及如何改进此结构!

标签: c#jsonarchitecturefactory-pattern

解决方案


推荐阅读