举个例子,你是个程序员,你希望任何时候有一个class A的实例就可以了,所以你在你的class B里封装了一个A的对象 class B { static A a = new A(); } 这样以后所有代码大家都可以使用B.a来调用A里的方法。很方便,可是没几个月你走了,换我接手 我想使用A里的方法,可是也许我根本就没有你的API,我不知道B里已经有了一个static的A,因此我在我的class C里 class C { public void getA { A a =new A();//这个时候整个工程下出现了2个A的对象已经违背了你当初的设计,以后可能还会有更多的人new A(); //但是如果你当时把A设计成的单例,就不会出现这样尴尬的局面了 } }
单例和static的区别就有些变量和属性的区别了,单例更面向对象。。简单的举个单例强于static的例子:有一个N大的集合。要做单例,如果你用static就必须前置加载,使用单例就可以后置加载。。public class CollectionDataTable { public static tbs=new CollectionDataTable();
java codepackage edu.scit.singletion; public class Singletion { public static Singletion singletion; //专用的构造器,防止客户机创建多个实例 private Singletion(){ } //设计唯一的访问接口 public static synchronized Singletion getInstance(){ if(singletion== null){ singletion = new Singletion(); } return singletion; } public void print(){ System.out.println("==========hello=========="); } public String toString(){ return "king"; } }
你的理解是错误的,看一面代码: public class D { private D() { new A(); } private static D inst; public static D getInst() { if (inst == null) { return new D(); } return inst; } } public class E { private E() { new A(); } private static E inst; public static E getInst() { if (inst == null) { return new E(); } return inst; } }同样会出理多个A对象。
不过,我觉得单例更符合OO思想。
另外,如果有static变量,必须考虑多线程的问题。
private 构造器让人不可以new,通过get获取static对象的引用,这样可以保证任何时候都只有一个该对象的实例。
而static只是一个静态的对象,使用方便而已,并没有对那个对象任何的限制。和单例模式差了很多
以上纯个人理解
class B
{
static A a = new A();
}
这样以后所有代码大家都可以使用B.a来调用A里的方法。很方便,可是没几个月你走了,换我接手
我想使用A里的方法,可是也许我根本就没有你的API,我不知道B里已经有了一个static的A,因此我在我的class C里
class C
{
public void getA
{
A a =new A();//这个时候整个工程下出现了2个A的对象已经违背了你当初的设计,以后可能还会有更多的人new A();
//但是如果你当时把A设计成的单例,就不会出现这样尴尬的局面了
}
}
static和实例没关系。只是不需要创建实例再调用,直接使用类就可以调用。
两者还是有很大区别的。
而static修饰的是全局的,任何地方都可以修改了。
而单列这是在你实际使用该对象的时候才new出一个来。
同时static 安全性低。
只能说static是实现单例模式最方便的途径
{
public static tbs=new CollectionDataTable();
private CollectionDataTable()
{}
}public class CollectionDataTable
{
private object obj=new object();
private CollectionDataTable tbs
private CollectionDataTable()
{} public CollectionDataTable Tbs
{
if(obj!=null)
tbs=new CollectionDataTable ();
return tbs;
}
}
//一个在于程序启动时就new 对象一个在第一次使用时才new,很有可能这个对象牛大,并且N多用户的情况是不使用到该对象的。所以他们没必要实例化。
这样的话,单例就强于static很多
使用static的话并不能限制对象实例的个数。
1.单例无论怎么说还是类实例,而类实例占用的内存空间是堆空间,而Class则被加载置方法区,包括所有的方法;
2.单例是从设计模式层面讲的,是相对类的运行空间讲的,Spring容器也有单实例的概念,但它的“singleton”实例是容器创建的,并且无需满足“自行创建”的要求。因此单例是相对的,在Spring的项目中,是相对Spring容器,在需要“自行创建”的环境中,是相对JVM实例的,也就是一个运行中的Java程序,显然Static是绝对的概念;
3.单例是类实例,从另一个角度看,首先是对事物的抽象,同时由于事物在现实环境中是单一的实体、资源等等,例如一个公司就一台打印机那样。从设计角度看,这个类需要抽象出事物的特性,同时由于是单例,是竞争资源,所以需要考虑互斥问题,否则就用Static得了,毕竟简单。
还有考虑到线程安全. http://msdn.microsoft.com/en-us/library/ms954629.aspx
public static Singletion singletion; //专用的构造器,防止客户机创建多个实例
private Singletion(){ } //设计唯一的访问接口
public static synchronized Singletion getInstance(){
if(singletion== null){
singletion = new Singletion();
}
return singletion;
} public void print(){
System.out.println("==========hello==========");
}
public String toString(){
return "king"; }
}
你的理解是错误的,看一面代码:
public class D {
private D() {
new A();
}
private static D inst;
public static D getInst() {
if (inst == null) {
return new D();
}
return inst;
}
}
public class E {
private E() {
new A();
}
private static E inst;
public static E getInst() {
if (inst == null) {
return new E();
}
return inst;
}
}同样会出理多个A对象。