c# - C# : How to ensure an object instance can only be created by a factory class? 中的工厂模式

标签 c# design-patterns oop factory

最近我一直在考虑保护我的一些代码。我很好奇如何确保一个对象永远不能直接创建,而只能通过工厂类的某种方法创建。假设我有一些“业务对象”类,我想确保此类的任何实例都具有有效的内部状态。为了实现这一点,我需要在创建对象之前执行一些检查,可能是在其构造函数中。这一切都很好,直到我决定让这个检查成为业务逻辑的一部分。那么,我怎样才能安排一个业务对象只能通过我的业务逻辑类中的某些方法而不是直接创建呢?使用 C++ 的一个好旧的“ friend ”关键字的第一个自然愿望将无法用于 C#。所以我们需要其他选择...

让我们尝试一些例子:

public MyBusinessObjectClass
{
    public string MyProperty { get; private set; }

    public MyBusinessObjectClass (string myProperty)
    {
        MyProperty = myProperty;
    }
}

public MyBusinessLogicClass
{
    public MyBusinessObjectClass CreateBusinessObject (string myProperty)
    {
        // Perform some check on myProperty

        if (true /* check is okay */)
            return new MyBusinessObjectClass (myProperty);

        return null;
    }
}

这一切都很好,直到您记得您仍然可以直接创建 MyBusinessObjectClass 实例,而无需检查输入。我想完全排除这种技术可能性。

那么,社区对此有何看法?

最佳答案

您可以将构造函数设为私有(private),并将工厂设为嵌套类型:

public class BusinessObject
{
    private BusinessObject(string property)
    {
    }

    public class Factory
    {
        public static BusinessObject CreateBusinessObject(string property)
        {
            return new BusinessObject(property);
        }
    }
}

这是可行的,因为嵌套类型可以访问其封闭类型的私有(private)成员。我知道这有点限制,但希望它会有所帮助...

关于c# - C# : How to ensure an object instance can only be created by a factory class? 中的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/515269/

相关文章:

design-patterns - 外观和抽象的出现模式

c# - 有什么好的例子或框架可以教我n层开发吗?

java - 如何根据Java中的构造函数参数声明具有不同类型的类字段

c# - 空 for(;;) 代表什么?

c# - 错误 "check the manual that corresponds to your MySQL server version"

c# - 从网站 asp.net 转移到 android 以及从 android 转移到网站 aps.net?

c# - 我将如何设计一个存储库来处理多个数据访问策略?

php - ZF3 从表达式创建 SELECT 查询

c# - ASP.NET 中的面向对象编程

c# - "a field initializer cannot reference non static fields"在 C# 中是什么意思?