JAVA自学教程(单例设计模式)



JAVA自学教程(单例设计模式)。

杂谈:

如果一个类里的方法都是静态的,那么就没有必要创建对象,为了不让其他程序创建对象,就可以把当前类的构造函数私有化。

  1. class MAN
  2. {
  3.     private MAN()
  4.     {
  5.     }
  6. }
class MAN
{
	private MAN()
	{	
	}
}

文档注释:命令:javadoc
只能解析/** 开始至 */结束的内容;/* */则不行
路径设置问题:
当要运行,两个以上路径中的class文件时,路径都要设置,命令:classpath=.;c:\myhelp或者:classpath=.;%myhelp%
清除路径: set classpath=
设计模式:对问题行之有效的解决方案
单例设计模式:
保证一个类在内存中对象的唯一性
必须对于多个程序使用同一个配置信息对象时,就要保证对象的唯一性
如何保证对象的唯一性:
1.不允许其他对象new对象 2.在该类中创建一个本类实例 3.对外提供一个方法,让其他程序可以获取该对象
步骤:
1.私有化该类的构造函数 2.通过new在本类中创建一个本类对象

3.定义一个共有的方法将创建的对象返回

 

  1. import java.util.Scanner;
  2. class MAN
  3. {
  4.     private static MAN jo = new MAN();//第二步
  5.     //不共有,为了可控
  6.     private int x = 5;
  7.     private MAN()//第一步
  8.     {
  9.     }
  10.     public static MAN Creat (String key) //第三步
  11.     {
  12.         if(key==”stdio”)//正确就给予对象使用,否则不
  13.         return jo;
  14.         return null;
  15.     }
  16.     void show()
  17.     {
  18.         System.out.println(“ASDf”);
  19.     }
  20. }
  21. public class Main
  22. {
  23.     public static void main (String[] args)
  24.     {
  25.         //MAN SS = MAN.Creat();
  26.         String key = “stdio”;
  27.         MAN s = MAN.Creat(key);
  28.     }
  29. }
import java.util.Scanner;

class MAN
{
	private static MAN jo = new MAN();//第二步
	//不共有,为了可控
	private int x = 5;
	private MAN()//第一步
	{

	}
	public static MAN Creat (String key) //第三步
	{
		if(key=="stdio")//正确就给予对象使用,否则不
		return jo;
		return null;
	}
	void show()
	{
		System.out.println("ASDf");
	}

}
public class Main
{

	public static void main (String[] args) 
	{
		//MAN SS = MAN.Creat();
		String key = "stdio";
		MAN s = MAN.Creat(key);
	}
}

 

 

单例设计的第一种模式

//饿汉式


示例:

  1. import java.util.Scanner;
  2. class Test
  3. {
  4.     private static Test jo = new Test();//第二步,//类一加载,对象就存在
  5.     //不共有,为了可控
  6.     private int num;;
  7.     private Test()//第一步
  8.     {
  9.     }
  10.     public static Test Creat (String key) //第三步
  11.     {
  12.         if(key==”stdio”)//正确就给予对象使用,否则不
  13.         return jo;
  14.         return null;
  15.     }
  16.     public void set(int num)
  17.     {
  18.         this.num = num;
  19.     }
  20.     public int get()
  21.     {
  22.         return num;
  23.     }
  24.     void show()
  25.     {
  26.         System.out.println(“ASDf”);
  27.     }
  28. }
  29. public class Main
  30. {
  31.     public static void main (String[] args)
  32.     {
  33.         String key = “stdio”;
  34.         Test s1 = Test.Creat(key);
  35.         Test s2 = Test.Creat(key);
  36.         System.out.println(s1==s2);
  37.         s1.set(10);
  38.         s2.set(20);
  39.         System.out.println(s1.get()+”  “+s2.get());//20 20,因为只有一个对象
  40.     }
  41. }
import java.util.Scanner;

class Test
{
	private static Test jo = new Test();//第二步,//类一加载,对象就存在
	//不共有,为了可控
	private int num;;
	private Test()//第一步
	{

	}
	public static Test Creat (String key) //第三步
	{
		if(key=="stdio")//正确就给予对象使用,否则不
		return jo;
		return null;
	}
	public void set(int num)
	{
		this.num = num;
	}
	public int get() 
	{
		return num;
	}
	void show()
	{
		System.out.println("ASDf");
	}

}
public class Main
{

	public static void main (String[] args) 
	{

		String key = "stdio";
		Test s1 = Test.Creat(key);
		Test s2 = Test.Creat(key);
		System.out.println(s1==s2);
		s1.set(10);
		s2.set(20);
		System.out.println(s1.get()+"  "+s2.get());//20 20,因为只有一个对象
	}
}

类中创建的对象  内存示意图:

 

单例设计模式的另一表现:
//懒汉式,一开始不做,真正用的时候才做,特点:延迟加载模式

 

  1. class Test
  2. {
  3.     private static Test s = null;//类加载进来,只有调用了Creat方法时,且符合创建条件时,才会创建对象
  4.                     //也就是单例设计模式,延迟加载模式,一般考察点
  5.     private int num;;
  6.     private Test()
  7.     {
  8.     }
  9.     public static Test Creat (String key)
  10.     {
  11.         if(key==”stdio” && s==null)
  12.         s = new Test();//如果符合就给予对象使用
  13.         return s;
  14.     }
  15.     public void set(int num)
  16.     {
  17.         this.num = num;
  18.     }
  19.     public int get()
  20.     {
  21.         return num;
  22.     }
  23.     void show()
  24.     {
  25.         System.out.println(“ASDf”);
  26.     }
  27. }
  28. public class Main
  29. {
  30.     public static void main (String[] args)
  31.     {
  32.         String key = “stdio”;
  33.         Test s1 = Test.Creat(key);
  34.         Test s2 = Test.Creat(key);
  35.         System.out.println(s1==s2);
  36.     }
  37. }
class Test
{
	private static Test s = null;//类加载进来,只有调用了Creat方法时,且符合创建条件时,才会创建对象
				    //也就是单例设计模式,延迟加载模式,一般考察点
	private int num;;
	private Test()
	{

	}
	public static Test Creat (String key) 
	{
		if(key=="stdio" && s==null)
		s = new Test();//如果符合就给予对象使用

		return s;
	}
	public void set(int num)
	{
		this.num = num;
	}
	public int get() 
	{
		return num;
	}
	void show()
	{
		System.out.println("ASDf");
	}

}
public class Main
{

	public static void main (String[] args) 
	{

		String key = "stdio";
		Test s1 = Test.Creat(key);
		Test s2 = Test.Creat(key);
		System.out.println(s1==s2);

	}
}

 

PS:懒汉式存在一些隐患,如果被多线程技术所操纵时,并发访问,有可能导致无法保证对象的唯一性,当改到保证唯一性时,效率会降低

面试时,一般会面试 懒汉式 开发时,用 饿汉式