单例程的由来(自己根据需求分析,自己一步一步敲代码,修改得到):
想到一个问题:有多个对象来共同的操作一个对象,怎么实现呢?这里首先想到的
是限制随意的创建对象,可以用到的方法是将类的构造函数私有化,于是有了下面的一片代码:
<pre name="code" class="java">class Shiyan
{
private Shiyan(){}
}
class ShiyanDemo
{
public static void main(String[] args)
{
Shiyan s = new Shiyan();
}
}
当然程序是不能运行的,会提示 java:11: 错误: Shiyan()可以在Shiyan中访问private
Shiyan s = new Shiyan();
这里连一个对象都不能创建,这里我又想到了创建对象不就是得到新开辟的内存空间的
地址嘛,我可以在类的内部写代码开辟内存空间,然后把这段内存空间的地址返回出去
就可以了,于是加上下面1,2 的代码:
<pre name="code" class="java"> class Shiyan
{
Shiyan s = new Shiyan(); // 1. 加上的代码
private Shiyan(){}
public Shiyan chuangjianShiyan() // 2. 加上的代码
{
return s;
}
class ShiyanDemo
{
public static void main(String[] args)
{
Shiyan s = new Shiyan();
}
}
这里与遇到的问题是,还是要创建对象啊,怎么能不创建对象呢,想到了把
<pre name="code" class="java">public Shiyan chuangjianShiyan()
{
return s;
}
静态化,即加上static关键字,这样就能直接用类名来调用了,该函数的静态化导致我必须将 <pre name="code" class="java"> Shiyan s = new Shiyan();
这一句静态化,因为静态的函数不能调用非静态的成员变量,于是得到:
<pre name="code" class="java">class Shiyan
{
Shiyan s = new Shiyan();
Shiyan(){}
public Shiyan chuangjianShiyan()
{
return s;
}
}
class ShiyanDemo
{
public static void main(String[] args)
{
Shiyan s = Shiyan.chuangjianShiyan();
System.out.println(s);
}
}
这里继续把
static Shiyan s = new Shiyan();
私有化,得到
<pre name="code" class="java">class Shiyan
{
static Shiyan s = new Shiyan();
private Shiyan(){}
static public Shiyan chuangjianShiyan()
{
return s;
}
}
class ShiyanDemo
{
public static void main(String[] args)
{
Shiyan s1 = Shiyan.chuangjianShiyan();
Shiyan s2 = Shiyan.chuangjianShiyan();
System.out.println(s1);
System.out.println(s2);
}
}
这就得到了单例程的程序代码。最重要的几点:1, 不能随意的创建对象-------构造函数私有化2, 静态函数不能调用非静态的成员变量--------- s的静态化上面的程序称为饿汉式单例程常用的为饱汉式单例程,需要在饿汉式单例程基础上做出修改
<pre name="code" class="java">class Shiyan
{
static private Shiyan s = null; //
private Shiyan(){}
static public Shiyan chuangjianShiyan()
{
if (s == null) //
s = new Shiyan(); //
return s;
}
}
class ShiyanDemo
{
public static void main(String[] args)
{
Shiyan s1 = Shiyan.chuangjianShiyan();
Shiyan s2 = Shiyan.chuangjianShiyan();
System.out.println(s1);
}
}
个人也觉得饱汉式更好,既不无控制的创建对象,也更好理解!!!!!!