Singleton和static的区别

本文探讨了Singleton模式与静态成员在实现上的异同,特别是在结合接口使用时的不同应用场景。作者通过具体的逻辑层与持久层交互的例子,说明了在何种情况下更适合采用Singleton而非静态成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原来在别的地方发过,没人理我. 难道我说的不对吗.
我是 give me code 的支持者.

想按照我的思路讨论一下:
1 Singleton和Static的对比:
我个人认为Singleton和Static在逻辑上是一样的, 即我希望只有一个东西让我用.
public Class A implements I{
public static void method(){
}
}
这样我可以直接用A.method(); 为什么还要费劲的去用singleton模式呢
我想 static 的问题在于不能结合接口, 如果 接口 I 中定义了方法 method,
上面就不能那么用. 而singleton可以.

public class A implements I{
private A(){};
private transient static A a = null;
public synchronized static A getInstance() {
if (a == null){
a = new A();
}
return a;
}
public void method(){}
}
所以是否涉及到接口, 我觉得是考虑是否采用Singleton的直接原因之一.
因为java中的所谓面向对象编程, 我觉得就是面向接口编程. 在java的多层次结构下,
Interface是不可避免的.

在这里我想举一个例子: persistence层和logic层. 就实现一个logic层调用persistence层.
logic层调用persistence层时, 通过一个Interface Pi.

Interface Pi {
update(Object);
}
但是他有3个实现类, 比如分队对应db2, oracle, sqlserver. 为什么呢, 可能是由于
想用一些数据库特有的sql吧.

Class PiDB2(){}; Class PiOracle{}; Class PiSqlserver(){};
但实际上这3个类我也不希望有超过一个的对象,为什么呢? 主要就是没用, 因为里面没有对象属性.
只有方法. 所以我自然就会想到是用 static呢, 还是Singletion.
但因为他们实现了接口, 就只有Singletion一种选择了. [不知大家会不会同意我这个场景设计?]

但是在这个例子中, 也有使用static的机会[或者说必然要在某一个环节上去使用]
就是logic层是如何获得Pi的.
Class LogicPersistenceBridge(){
public static Pi getPi() {
// 读一些配置文件来决定是什么库
if (db2) return PiDB2.getInstance();
if (oracle) return PiOracle.getInstance();
if (sqlserver) return PiSqlserver();
}
}
在这里,static是当然的选择, 选择其他的方式都有隔靴搔痒的感觉. static是最直接最自然的方式.

所以这个例子惯穿起来是这样的
Class updateUser() {
public void method() {
// 第一步, 构造数据对象
User u = new User();
u.setName(/"我/");

// 第二步, 获得persistence
Pi pi = null;
pi = LPBridge.getPi();

// 第三步, 存库
pi.update(u);
}
}
例子到此为止, 我觉得我是花了些心思的, 希望能有些回应. 你们赞同我的说法吗?
所以我觉得java的语言和虚拟机规范是 singleton和static之间不同的重点, 逻辑上它们是一个意思.
而且, 讨论这个问题时, 一定要考虑Interface的存在.

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值