ASP.Net+Android+IOS开发------期待与您交流
<单例设计模式及其我对它的理解>
设计模式:所谓设计模式就是解决某类问题行之有效的方法,是一种思想,是规律的总结
单例模式:单例模式算是学java以来接触的第一种设计模式,简单来说就是实现对象的唯一性的一种模式方法,用来保证某个类在内存中只有一个对象。
初识单例是在面向对象的时候,它主要分为两种模式,懒汉式与饿汉式。
实现步骤:
1,为了避免其他程序建立该类对象,先禁止其他程序建立此对象,所以先私有构造函数。
2,为了其他程序访问到该类对象,须在本类中创建一个该类私有对象。
3,为了方便其他程序访问到该类对象,可对外提供一个公共访问方式。
单例设计模式的两种方式,用代码体现
A:饿汉式 当类加载的时候,就创建对象
class Singlehungry{
//私有构造函数,不让别的类建立该类对象
private Singlehungry(){}
//私有自己建立的本类对象
private static final Singlehungry s= new single();
//提供本类对象访问的公共方法
public staitc Singlehungry getSingle(){
return s;
}
}
B:懒汉式,当调用方法时才创建对象
class Singleidle{
//使用构造函数
private Singleidle(){}
//私有本类对象引用
private static final Singleidle s=null;
//提供对外方法公共方法
public static Singleidle getSingle(){
If(s==null)
s= new Singleidle()
return s;
}
}
为什么要私有本类对象呢,因为这样的话,当别的类新建此对象时,指向的都是同一个地址值,这样才能有效的达到内存中只有一个地址值,从而只有一个对象,不管你NEW几次地址值还是只有一个。
使用现实生活例子实现单例模式:
比如有一个游泳池,现在每个人都想来游泳,但是游泳池只有一个,现在就要使用单例设计模式来解决问题。
//饿汉式
class Youyongchi{
private Youyongchi(){}
private static final Youyongchi yyc=new Yonyongchi();
public static Youyongchi method(){
return yyc;
}
}
//懒汉式
Class Youyongchi{
Private Youyongchi(){}
//这里和饿汉式的区别就是使用了延迟加载,当类调用method方法是对象才会被建立
private static final Youyongchi yyc = null;
public static Youyongchi method(){
//这里判断一下是否为空是的话就直接创建对象,否则就返回对象
//一般第一次加载都会创建对象
If(yyc==null)
new Youyongchi();
return yyc;
}
}
class Yonyong{
public static void main(String[] args){
//创建单例对象引用并调用方法
Youyongchi y1 = youyongchi.method();
Youyongchi y2 = youyongchi.method()
sop(y1);
sop(y2);
}}
//这样打印出来的地址值就是相同的
//注意 如果:Youyongchi y1=new youyongchi();这样调用是不行的因为类的构造函数已经被私有,不允许创建对象,要想得到游泳池对象,只能直接类名调用method方法获取唯一地址值的游泳池。
开发中我们一般不用懒汉式,因为懒汉式的延迟加载,所以效率低,而且他在线程中还不安全,如果多个线程同时操作懒汉式时就有可能出现线程安全问题。
下面我们来掩饰一下在线程中懒汉式的不安全性,和怎么改进他的不安全性。
class Single
{
private Single(){}
private static Single s;
public static Single getInstance()
{
//此处会造成安全隐患,因为当多个线程一起操作他时,有可能一个线程还没执行完,就被另一线程抢到执行权,从而会创造出两个不同的对象。
if(s==null)
s=new Single();
return s;
}
}
在线程中单例模式的懒汉式的对象的延迟加载不安全问题,我们可以给线程加上同步锁synchronized{} 被它修饰之后,当一个线程进去了另一线程不能进去从而达到了安全的特性,代码如下
public static Single getInstance()
{
if(s==null)
{
synchronized(this)//this为本类对象的同步锁,也可以写//Single.class
{
if(s==null)
s=new Single();
}
}
return s;
}
**使用了同步锁能达到安全的目的,却让程序的执行效率变低了,所以我们平时使用是使用饿汉式。
**对于单例模式进行如下总结
**当需要使用共享数据,而不希望多创建对象的时候,使用单例模式
**单例模式就是达到保证对象的唯一性的目的
**饿汉式是类一加载进内存就创建好了对象,从而很安全
**懒汉式则是类加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。
ASP.Net+Android+IOS开发------期待与您交流
详细请查看:http://edu.youkuaiyun.com