JAVA自学教程(单例设计模式)。
杂谈:
如果一个类里的方法都是静态的,那么就没有必要创建对象,为了不让其他程序创建对象,就可以把当前类的构造函数私有化。
- class MAN
- {
- private MAN()
- {
- }
- }
class MAN
{
private MAN()
{
}
}
文档注释:命令:javadoc
只能解析/** 开始至 */结束的内容;/* */则不行
路径设置问题:
当要运行,两个以上路径中的class文件时,路径都要设置,命令:classpath=.;c:\myhelp或者:classpath=.;%myhelp%
清除路径: set classpath=
设计模式:对问题行之有效的解决方案
单例设计模式:
保证一个类在内存中对象的唯一性
必须对于多个程序使用同一个配置信息对象时,就要保证对象的唯一性
如何保证对象的唯一性:
1.不允许其他对象new对象 2.在该类中创建一个本类实例 3.对外提供一个方法,让其他程序可以获取该对象
步骤:
1.私有化该类的构造函数 2.通过new在本类中创建一个本类对象
3.定义一个共有的方法将创建的对象返回
- 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);
- }
- }
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);
}
}
单例设计的第一种模式
//饿汉式
示例:
- 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,因为只有一个对象
- }
- }
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,因为只有一个对象
}
}
类中创建的对象 内存示意图:
单例设计模式的另一表现:
//懒汉式,一开始不做,真正用的时候才做,特点:延迟加载模式
- 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);
- }
- }
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:懒汉式存在一些隐患,如果被多线程技术所操纵时,并发访问,有可能导致无法保证对象的唯一性,当改到保证唯一性时,效率会降低
面试时,一般会面试 懒汉式 开发时,用 饿汉式