《设计模式》中的经典模式并不是用来照搬的,实际工程中往往是取其思想,使用“变种”,或多个模式的混合体。
其中的“单例模式”,最为简单,容易理解,变种少。
“单例模式”要解决的问题是:如何能在源头上保证一个类将来不会创建多个实例。
应在若干项目经验后,再研读设计模式
package NO3;
class T{
}
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new T();
new T();
}
}
在上面这种情况下,对类进行实例化的权利在类的外部,类本身不能阻止创建多个实例
---------->需要将决定权收回到类本身
第一步: 把构造方法禁止掉,因为都new一个实例,都要用到构造方法,将构造方法设为private,则类外部访问不到
<span style="color:#000000;">package NO3;
class T{
private T(){
}
}
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
</span>
第二步: 创建对象工作的一个转移,由外部创建转向内部创建
package NO3;
class T{
private T(){
}
public static T getInstance(){//实现了创建对象工作的转移,由外部转向了内部
return new T(); //在类的内部可以访问到构造方法
}
}
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
T a = T.getInstance();
T b = T.getInstance();//此时还是可以创建多个实例
}
}
第三步: 防止第二次创建实例,懒惰方式(懒汉方式)
package NO3;
class T{
private static T t;//在类的内部存储一个唯一的实例
private T(){
}
public static T getInstance(){
if(t == null) //懒惰方式,当对象第一次使用的时候才被初始化
t = new T();
return t;
}
}
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
T a = T.getInstance();
T b = T.getInstance();
System.out.println(a == b);
//输出为 true }
}
第三步: 防止第二次创建实例, 初始化风格(饿汉方式)
<span style="color:#000000;">package NO3;
//当类在加载的时候立刻去创建它的实例对象
//这种方式适用于那些比较复杂的资源,因为它们创建所要耗费的时间比较多
class T{
private static T t;//在类的内部存储一个唯一的实例
static{ //静态块, 当类加载时候,立即去执行静态块中的内容
t = new T();
}
private T(){
}
public static T getInstance(){
return t;
}
}
public class Test08 {
public static void main(String[] args) {
// TODO Auto-generated method stub
T a = T.getInstance();
T b = T.getInstance();
System.out.println(a == b);
}
</span><span style="color:#000000;">}
</span>
对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行时第一次获得对象的速度慢。
单例模式的变种: 少例 只容许两个或三个实例存在
注意:以下代码不完整
<span style="color:#000000;">package NO3;
import java.util.List;
class T{
private static T t;//在类的内部存储一个唯一的实例
</span>
<span style="color:#000000;"> private static T t2;
//private static T t3; </span>
<span style="color:#000000;"> private static List list;
</span>
<span style="color:#000000;"> //生成一个List来存储T对象</span>
<span style="color:#000000;"></span>
<span style="color:#000000;"> private T(){
}
public static T getInstance(){
if(t == null) //懒惰方式,当对象第一次使用的时候才被初始化
t = new T();
return t;
}
}
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
T a = T.getInstance();
T b = T.getInstance();
System.out.println(a == b);
}
}
</span>