问题描述
我正在寻找一个代码库,我经常看到类似的东西:
public class SomeClass
{
protected static SomeClass myObject;
//...
public static SomeClass getObject()
{
return myOjbect
}
}
我想确保理解这背后的目的。 它是否确保一个类的实例共享,即使它被多次实例化? 我不确定这里的词汇,否则我会搜索答案,所以如果这个模式有名字,请告诉我。
此外,这似乎有点鸡和蛋的定义,因为该类包含类的类型的对象。 为什么这不是荒谬的?
谢谢!
1楼
这称为Singleton设计模式。
你说的目的是确保只创建一个类的实例是正确的。
有关该模式的优秀文章。
2楼
这实际上只适用于 ,其中只有一个类的实例。
虽然它有其用途,但Singleton经常被滥用和滥用(通常将程序编程伪装成OO)。
它也经常出现在Java AWT或Swing的示例代码中,您通常在其中继承Frame
/ JFrame
,并在同一个类内的main
方法中创建实例。
此外,这似乎有点鸡和蛋的定义,因为该类包含类的类型的对象。 为什么这不是荒谬的?
为什么你认为它是?
该类主要描述了此类型的成员实例 - 但static
成员不属于实例,它属于类本身,因此它与类的“蓝图”角色没有任何关系。
因为这个原因,静态成员实际上有点不合适。
但即使在实例级别,您也可以使用相同类型的引用。 例如,链表中的条目通常具有对下一个和前一个条目的两个引用,这些条目属于同一类。
3楼
您提到的模式称为“Singleton”,但是从您的代码示例中不清楚这是否真的是预期的。 由于成员受到保护,我猜不会 - 如果有子类,则可能没有单个实例。
4楼
这并不罕见; 它可以是实现模式的好方法。 也可以有其他用途 - 有时候你会想要一些 - 而不是更多 - 给定类的对象; 这个班级是一个很好的地方。 如果您不希望其他类能够创建此类的对象,则通常也会为该类提供私有构造函数。
这并不矛盾,因为编译器在完全编译类之前可以知道对类的引用。 后来 - 如果你想以这种方式思考它 - 它可以“填补空白”。
5楼
它叫做Singleton。 您确保只创建给定类的ONE(1)对象。
您应该添加一个私有的构造函数,因此唯一创建该对象的是该类。
public class SomeClass
{
// Using private constructor
protected static SomeClass myObject = new SomeClass();
private SomeClass(){
//...
}
public static SomeClass getObject()
{
return myOjbect
}
}
在这里还有更多
您可能想看看