packagecom.wepull.singleton;
/**
*@authorleno饿汉式单例类
*/
publicclassEagerSingletion {
privatestatic EagerSingletion single=newEagerSingletion();
privateEagerSingletion() {
}
publicstaticEagerSingletion getnSingInstance() {
return single;
}
}
packagecom.wepull.singleton;
/**
*@authorleno懒汉式单例类
*/
publicclassLazySingletion {
privatestatic LazySingletion single;
privateLazySingletion() {
}
publicstaticLazySingletion getnSingInstance() {
if (single==null) {
single=newLazySingletion();
}
return single;
}
}
两种不同实现方式的区别:
<1>从资源利用的角度看,懒汉式是在调用其静态方法的时候才被实例化的,所以要比饿汉式稍好一些。
<2>从反映时间和速度上看,饿汉式在类加载的时候就得到了初始化,所以要比懒汉式好一些。
由上可见,创建一个单子类必须满足以下三个条件:
1.构造器私有
2.自己持有自身的一个静态引用
3.对外面系统提供访问唯一实例的公共静态接口(方法).
下面我们看一个足够形象的例子,让大家对单子模式有更深刻的了解:
packagecom.wepull.singleton;
importjavax.swing.*;
importjava.awt.*;
/**
*@authorleno单子模式类
*/
publicclassDemoSingletonextendsJFrame {
//一个私有的,静态的本类对象
privatestatic DemoSingleton testFrame=newDemoSingleton();
JLabeljLMes=newJLabel();
//构造必须是私有的,这样其它的类才不能访问
privateDemoSingleton() {
getContentPane().setLayout(null);
this.getContentPane().add(jLMes);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
jLMes.setText("这是产生的唯一窗体");
jLMes.setBounds(newRectangle(103, 53, 230, 96));
}
//公有的静态方法返回一个本类对象
publicstaticsynchronizedDemoSingleton getInstance() {
return testFrame;
}
}
packagecom.wepull.singleton;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
/**
*@authorleno测试类
*/
classTestextendsJFrame {
JButtonjBtn=newJButton();
publicTest() {
getContentPane().setLayout(null);
jBtn.setBounds(newRectangle(125, 182, 168, 43));
jBtn.setText("单击产生唯一窗体");
this.jBtn.addActionListener(newMyActionListener());
this.getContentPane().add(jBtn);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setSize(500, 300);
this.setVisible(true);
}
classMyActionListenerimplementsActionListener {
//单击按钮时调用单子模式类的静态方法,获得一个对象
publicvoidactionPerformed(ActionEvent e) {
DemoSingleton testFrame = DemoSingleton.getInstance();
testFrame.setSize(300, 200);
testFrame.setVisible(true);
}
}
publicstaticvoidmain(String[] args) {
Test test =newTest();
}
}
上面我们在一个窗口里面设置了一个按钮,不管你点击多少次,它都只会弹出唯一的一份窗口实例。