----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
5.面向对象--单例设计模式
设计模式概念:对问题行之有效的解决方法,是一种思想,对面向对象的语言都是通用的。
Java有23种设计模式,单例设计模式是其中一种。
单例设计模式解决的问题:保证一个类在内存中对象的唯一性。
什么时候使用单例设计模式?
在Java中多个引用变量,操作同一个对象以及在实际应用中多个应用程序,操作一个类,就需要使用单例设计模式。
实现单例设计模式的步骤:
1, 构造函数私有化。
2, 使用new创建本类对象,并加上static修饰符。
3, 对外提供公共访问方法,将对象返回。
单例的内存图解:
如:
class Person
{
/*
实现单例的三步骤:
*/
private Person(){}//构造函数私有化
private static final Person p=new Person();//使用new创建本类对象。
public static Person getInstance(){//对外提供公共方法,把对象返回。
return p;
}
int age;
String name;
public void show(){
System.out.println(name+":"+age);
}
}
class Demo
{
public static void main(String[]args){
Person p1=Person.getInstance();
Person p2=Person.getInstance();
p1.age=20;
p2.name="张三";
System.out.println(p1==p2);//结果为true
}
}
以上代码,p1和p2变量,指向堆内存中的同一个实体。
如图:
单例模式分为:懒汉式、饿汉式
懒汉式:类加载时没有对象,调用对外提供的公共方法getInstance(),才创建对象,延迟加载。
class Person
{
private Person(){}
private static Person p=null;//类加载时,没有创建对象。
public static Person getInstance(){//方法中使用if判断,如果p的引用等于null,就创建对象,否则,返回引用变量p。
if(p==null)
p=new Person();
return p;
}
/*
多线程时,懒汉式安全问题的解决:
public static Person getInstance(){
if(p==null){
synchronized(Person.class){
if(p==null){
p=new Person();
}
}
}
return p;
}
*/
}
class SingleDemo
{
public static void main(String[]args){
Person p1=Person.getInstance();
Person p2=Person.getInstance();
System.out.println(p1==p2);//结果为true
}
}
饿汉式:类一加载,就创建对象。
class Person
{
private Person(){}
private static final Person p=new Person();//类一加载就创建对象,
public static Person getInstance(){//调用方法,返回引用变量p,可见,返回的引用变量指向了同一个对象。
return p;
}
}
class SingleDemo
{
public static void main(String[]args){
Person p1=Person.getInstance();
Person p2=Person.getInstance();
System.out.println(p1==p2);//结果为true。
}
}
总结:单例设计模式,解决了一个类在内存中对象的唯一性,如果一个类需要保证其对象的唯一性,则只需要在类中加入单例设计模式的三个步骤的代码,就可以。
----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------