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

确保只有工厂才能创建实例

oop
  •  1
  • Prabu  · 技术社区  · 16 年前
    class XFactory {
    
      private XFactory() {}
    
      static void getX() {
        if(...)
          return new A(new XFactory());
        else
          return new B(new XFactory());
      }
    
    }
    
    class A {
       private A() {}
       public A(XFactory xf) {}
    }
    
    class B {
       private B() {}
       public A(XFactory xf) {}
    }
    

    通过这种方式,我可以确保只有Factory可以创建其所属类的实例。

    这是正确的方法还是有其他替代/好的方法?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Alex Martelli    16 年前

    常用的方法(在C++中)是使“所属类”构造函数私有,并让它们将工厂类声明为 friend .

        2
  •  1
  •   Asik    16 年前

    我会让类A和类B成为XFactory的朋友,并对它们的构造函数保密。因此,只有XFactory可以访问其构造函数。

    也就是说,在C++中。在Java或C#中,我看不到任何在编译时强制实现这一点的干净方法。您的示例远不是傻瓜式的,甚至有点令人困惑,因为只要有一个XFactory实例,他就可以将其传递给a或B的构造函数,并像那样直接实例化它们。

        3
  •  1
  •   TheJacobTaylor    16 年前

    将工厂设置为全局单例,并创建对象:

    • 将该密钥添加到正在使用的密钥的factory对象中的私有列表中
    • 将密钥传递给构造函数

    (我是否获得黑客点数?) 雅各布

        4
  •  -1
  •   KidDaedalus    16 年前

    在Java中,可以将构造函数设置为私有的,并以公共嵌套类的形式提供工厂,因为嵌套类可以访问声明它们的类的私有成员。

    public class ExampleClass {
    
        private ExampleClass() {
    
        }
    
        public class NestedFactory {
            public ExampleClass createExample() {
                return new ExampleClass();
        }
    }
    

    任何想要创建ExampleClass.NestedFactory的人都可以创建一个实例,并通过它实例化ExampleClass。

    因为Java编译器要求您为超类指定一个构造函数,所以我还没有找到一种方法来实现这一点,让您从ExampleClass继承。。。所以这是一个缺点。