bra*_*boy 21 java singleton design-patterns
今天我在面试中遇到了一个问题.是否可以在Singleton类上应用继承概念?我说因为构造函数是私有的,所以我们不能扩展那个Singleton类.
他问我的下一件事是在Singleton类上应用继承.因此,我将Singleton的构造函数视为受保护的思想,即child的构造函数也受到保护.但我错了,孩子可以有一个等于或高于此的修饰符.
所以,我让他给出一个关于这种情况的真实世界的例子.他无法给我一个,并说我无法提出问题,并希望我告诉他们这种情况是否可能.
我有点空白.我的问题是,
b.r*_*oth 12
是的,这在技术上是可行的,因为singleton是一种设计模式,而不是一种可能具有继承限制的语言结构.我只是重新实现public [Object] getInstance()子类中的方法(见下文).
而且,是的,单身人士也可以从继承中受益,因为他们可能与其他单身人士分享相似但不具有识别性的行为.
public class ParentSingleton {
private static ParentSingleton instance;
protected ParentSingleton() {
}
public static synchronized ParentSingleton getInstance() {
if (instance == null) {
instance = new ParentSingleton();
}
return instance;
}
public int a() {
// (..)
}
}
public class ChildSingleton extends ParentSingleton {
private static ChildSingleton instance;
public static synchronized ParentSingleton getInstance() {
if (instance == null) {
instance = new ChildSingleton();
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:作为的Eyal在下面他的评论中指出,在超类的构造函数必须作出保护(而不是私人的),否则它不会是子类和代码甚至不会编译可见.
Mic*_*rdt 12
引用圣经:
当唯一实例应该通过子类化可扩展时使用Singleton模式,并且客户端应该能够使用扩展实例而无需修改其代码.
Singleton模式有几个好处:[...] 3.允许改进操作和表示.Singleton类可以是子类,并且使用此扩展类的实例配置应用程序很容易.您可以使用运行时所需的类实例配置应用程序.
至于如何实现这一点:本书提出了几种方法,其中最复杂的是一个注册表,其中的实例按名称查找.
Ste*_*n C 10
您可以使用一组公共属性和方法创建一个抽象基类,然后创建一些子类作为单例类.那就是"以一种有用的方式应用继承概念".
但是你不能做的是创建一个严格实现的单例类的子类.如果声明单例类构造函数作为private子类将无法编译.如果您使用其他访问权限声明它,则可以在另一个类中使用构造函数来创建多个实例...因此,它不是严格意义上的单例.如果你将单例声明为abstract,则根本无法实例化...因此它不是单例.
| 归档时间: |
|
| 查看次数: |
6527 次 |
| 最近记录: |