首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是工厂生产单件的正确方法吗?

这是工厂生产单件的正确方法吗?
EN

Stack Overflow用户
提问于 2022-11-19 00:58:09
回答 1查看 46关注 0票数 1

我有一个工厂方法的代码来产生单子。我有一个小型毛伊岛应用程序,并希望拥有持久的全球数据。

代码语言:javascript
运行
复制
public static class FactoryService
{
    private static BudgetViewModel budgetViewModelInstance;
    private static AccountsViewModel accountsViewModelInstance;
    private static PayeesViewModel payeesViewModelInstance;

    public static BaseViewModel BuildViewModel(Type type)
    {
        if(type == typeof(BudgetViewModel))
        {
            budgetViewModelInstance ??= new BudgetViewModel();
            return budgetViewModelInstance;
        }
        else if(type == typeof(AccountsViewModel))
        {
            accountsViewModelInstance ??= new AccountsViewModel();
            return accountsViewModelInstance;
        }
        else if(type == typeof(PayeesViewModel))
        {
            payeesViewModelInstance ??= new PayeesViewModel();
            return payeesViewModelInstance;
        }
        else
        {
            throw new Exception($"Can't build View Model. Invalid View Model: {type}");
        }
    }
}

然后,当我想要一个视图模型引用时,我必须在调用BuildViewModel之前转换我想要的类型:

代码语言:javascript
运行
复制
BudgetViewModel budgetViewModel = (BudgetViewModel)FactoryService.BuildViewModel(typeof(BudgetViewModel));

这是..。对吗?有什么更好的方法来实现这一点吗?我不能为视图模型使用静态类,因为它们必须从ObservableObject继承。(摘自社区MVVM工具包)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-19 01:24:13

我会用仿制药。就像这样:

代码语言:javascript
运行
复制
public static class FactoryService
{
    private static BudgetViewModel budgetViewModelInstance;
    private static AccountsViewModel accountsViewModelInstance;
    private static PayeesViewModel payeesViewModelInstance;
    private static readonly object _lock = new object();

    public static T BuildViewModel<T>() where T : BaseViewModel, new()
    {
        if (typeof(T) == typeof(BudgetViewModel))
        {
            if (budgetViewModelInstance == null)
            {
                lock (_lock)
                {
                    if (budgetViewModelInstance == null)
                    {
                        budgetViewModelInstance = new();
                    }
                }
            }

            return budgetViewModelInstance as T;
        }
        else if (typeof(T) == typeof(AccountsViewModel))
        {
            if (accountsViewModelInstance == null)
            {
                lock (_lock)
                {
                    if (accountsViewModelInstance == null)
                    {
                        accountsViewModelInstance = new();
                    }
                }
            }

            return accountsViewModelInstance as T;
        }
        else if (typeof(T) == typeof(PayeesViewModel))
        {
            if (payeesViewModelInstance == null)
            {
                lock (_lock)
                {
                    if (payeesViewModelInstance == null)
                    {
                        payeesViewModelInstance = new();
                    }
                }
            }

            return payeesViewModelInstance as T;
        }
        else
        {
            throw new Exception($"Can't build View Model. Invalid View Model: {typeof(T)}");
        }
    }
}

然后您可以像这样调用:var viewModel = FactoryService.BuildViewModel<BudgetViewModel>();

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74496783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档