单例模式定义 :保证一个类仅有一个实例,并提供一个访问它的全局访问点;
要想控制一个类只被创建一个实例,那么首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类实例的创建工作,
然后由这个类来提供外部可以访问这个类实例的方法,因此单例模式的创建要做到以下三点
1 私有化类的构造方法 保证仅类自身完成实例创建工作,便于在内部控制创建实例的数目
2 定义静态存储实例的属性
3 给外界提供获取实例静态方法
两种创建方式 : 懒汉式 (以下为核心代码 并不完整)
private Singleton(){}//私有化构造方法
private static Singleton instance = null;//定义存储属性 因为懒所以只赋值为空 其它交给getInstance()
public static Singleton getInstance(){
//先判断instance是否有值
if(instance == null){
//如果没有值,说明还没有创建过实例,那就创建一个
//并把这个实例设置给instance
instance = new Singleton ();
} //如果有值,或者是创建了值,那就直接使用
return instance;
}
饿汉式(以下为核心代码 并不完整)
private Singleton(){}
//定义一个静态变量来存储创建好的类实例
//因为很饿了 所以迫不及待,直接在这里创建类实例,只会创建一次
private static Singleton instance = new Singleton();
//定义一个方法来为客户端提供类实例
//这个方法里面就不需要控制代码了
public static Singleton getInstance(){
//5:直接使用已经创建好的实例
return instance;
}
}
实例:
package singetest;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 该类只能有一个实例
private Person() {} // 私有无参构造方法
// 该类必须自行创建一个实例
// 有2种方式 以下为 饿汉式 懒汉式大家可自己练习下
private static Person ts = new Person();
// 这个类必须自动向整个系统提供这个实例对象 提供外部可以访问这个类实例的方法
public static Person getInstance() {
return ts;
}
}
package singetest;
public class TestMain{
public static void main(String[] args){
//Person p1=new Person();
//Person p2=new Person();
//System.out.println( p1+"\t"+ p2 );
private Singleton(){}//私有化构造方法
private static Singleton instance = null;//定义存储属性 因为懒所以只赋值为空 其它交给getInstance()
public static Singleton getInstance(){
//先判断instance是否有值
if(instance == null){
//如果没有值,说明还没有创建过实例,那就创建一个
//并把这个实例设置给instance
instance = new Singleton ();
} //如果有值,或者是创建了值,那就直接使用
return instance;
}
饿汉式(以下为核心代码 并不完整)
private Singleton(){}
//定义一个静态变量来存储创建好的类实例
//因为很饿了 所以迫不及待,直接在这里创建类实例,只会创建一次
private static Singleton instance = new Singleton();
//定义一个方法来为客户端提供类实例
//这个方法里面就不需要控制代码了
public static Singleton getInstance(){
//5:直接使用已经创建好的实例
return instance;
}
}
实例:
package singetest;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 该类只能有一个实例
private Person() {} // 私有无参构造方法
// 该类必须自行创建一个实例
// 有2种方式 以下为 饿汉式 懒汉式大家可自己练习下
private static Person ts = new Person();
// 这个类必须自动向整个系统提供这个实例对象 提供外部可以访问这个类实例的方法
public static Person getInstance() {
return ts;
}
}
package singetest;
public class TestMain{
public static void main(String[] args){
//Person p1=new Person();
//Person p2=new Person();
//System.out.println( p1+"\t"+ p2 );
Person s=Person.getInstance();
s.setName("张三");
System.out.println(s.getName());
s.setName("张三");
System.out.println(s.getName());
Person s1=Person.getInstance();
s1.setName("李四");
System.out.println(s1.getName());
s1.setName("李四");
System.out.println(s1.getName());
System.out.println( s +"\t"+ s1);//两个对象哈希值一致 表明只有一个实例
if(s==s1){
System.out.println("创建的是同一个实例");
}else if(s!=s1){
System.out.println("创建的不是同一个实例");
}else{
System.out.println("application error");
}
//new TestStream();
}
}
System.out.println("创建的是同一个实例");
}else if(s!=s1){
System.out.println("创建的不是同一个实例");
}else{
System.out.println("application error");
}
//new TestStream();
}
}