代码之家  ›  专栏  ›  技术社区  ›  Simon

如何防止对象被实例化(定义的“工厂类”除外)?

  •  3
  • Simon  · 技术社区  · 16 年前

    简而言之,我想防止对象在对象工厂类中指定的静态方法之外的任何地方实例化。

    这可能吗?

    3 回复  |  直到 16 年前
        1
  •  9
  •   tvanfosson    16 年前

    如果工厂和类位于同一程序集中,则可以将构造函数标记为内部。这将使程序集之外的任何类都不能调用构造函数(无反射)。处于同一程序集中的工厂将构造函数视为公共的,因此可以访问它们。

    或者,您可以将构造函数设置为私有,并在工厂内使用反射来实例化对象。您在使用反射时受到了一些影响,但这没有程序集限制,并且还可以防止同一程序集中的其他类使用工厂之外的任何东西。

        2
  •  1
  •   Simon    16 年前

    我与反射一起编写了一些示例代码,用于使用私有构造函数实例化对象:

        Private Shared Function CreateObject(Of t)() As t
    
        Try
            Dim ci As ConstructorInfo = GetType(Class1).GetConstructor(CType(BindingFlags.Instance + BindingFlags.NonPublic, _
                          BindingFlags), Nothing, Type.EmptyTypes, Nothing)
    
            Dim x As t = CType(ci.Invoke(Nothing), t)
    
            Return x
    
        Catch ex As NullReferenceException
            Throw New MissingMethodException("No private constructor found")
    
        Catch ex As Exception
            Throw
        End Try
    
    End Function
    
        3
  •  0
  •   adrianm    16 年前

    你需要多少保护?

    在工厂里,你把警告关掉。

    推荐文章