单例设计模式及其我对它的理解-----黑马程序员

本文介绍了单例设计模式的概念、实现步骤及两种方式(饿汉式与懒汉式),并通过实例展示了如何在ASP.NET、Android、iOS开发中应用单例模式,特别强调了在多线程环境下的安全性改进措施。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值