单例模式的伟大之处在于:只初始化一次对象(实例)。然后我们可以与非静态成员进行交互。但是单例模式更强大的是构造函数。
如果我们不需要初始化对象的构造函数,那么单例模式是没有意义的,我们可以使用静态类。
但是如果我们确实需要在构造函数中获取参数怎么办?
构造函数有一个角色,有两个选项:一个是将对象初始化为其初始值,第二个是将对象初始化为它通过参数获得的值,那么我们可以说单例模式省略了第二个吗?
否则,单例模式和静态类有什么区别?
谢谢,雅各布
单例模式的伟大之处在于:只初始化一次对象(实例)。然后我们可以与非静态成员进行交互。但是单例模式更强大的是构造函数。
如果我们不需要初始化对象的构造函数,那么单例模式是没有意义的,我们可以使用静态类。
但是如果我们确实需要在构造函数中获取参数怎么办?
构造函数有一个角色,有两个选项:一个是将对象初始化为其初始值,第二个是将对象初始化为它通过参数获得的值,那么我们可以说单例模式省略了第二个吗?
否则,单例模式和静态类有什么区别?
谢谢,雅各布
“单例模式是:仅初始化对象(实例)一次”,因此您可以执行以下操作:
public class MyClass {
MyClass me = null;
//private CTOR
private MyClass () {
}
public static MyClass ConstructMe(..parameters..) {
if(me != null)
return me;
me = new MyClass();
....setup parameters ....
return me,
}
}
你传递参数,你只能有一个实例。
如果这不是您要的,请澄清。
1)没有什么能阻止你在单例模式中实现一个接受参数的初始化器,只要它总是需要这些参数。伪代码:
class single{
private static single instance;
private single(){
default args;
}
private single(arg1, arg2){
}
public static init(){
if(instance == null){
instance = new single();
}
return instance;
}
public static init(arg1, arg2){
if(instance == null){
instance = new single(arg1, arg2);
}
else{
instance.setArg1(arg1);
instance.setArg2(arg2);
}
return instance;
}
}
2) 单例类可以扩展,也可以扩展其他类——赋予 OOP 的全部功能,静态类只是组织功能的一种结构化方式。
如果您在单例的构造函数中需要参数,则 IMO 存在设计缺陷。
您可以在实例化后使用 setter 来初始化您的成员,也可以将所需的实例作为成员函数的参数传递。
public class MyClass {
static MyClass single = null;
MyMember member;
private MyClass() {
}
public static MyClass getInstance() {
if(single == null)
single = new MyClass();
return single;
}
//------------------------------------------------------------
// First approach using setter
public void setMember(MyMember member) {
this.member = member;
}
public void doSomething() {
member.foo();
// do something
}
//------------------------------------------------------------
// Second approach pass by parameter
public void doSomething(MyMember param) {
param.foo();
// do something
}
}