黑马程序员技术交流社区

标题: 请教一下关于单例设计模式问题? [打印本页]

作者: 陈志辉    时间: 2014-4-10 09:21
标题: 请教一下关于单例设计模式问题?
本帖最后由 陈志辉 于 2014-4-10 15:35 编辑

用代码如何实现单例设计模式?原理是什么?
作者: 程浩    时间: 2014-4-10 11:21
标题: 暂时用java写
  1. public class TestStream {
  2.     private String name;
  3.     public String getName() {
  4.         return name;
  5.     }
  6.     public void setName(String name) {
  7.         this.name = name;
  8.     }
  9.     //该类只能有一个实例
  10.     private TestStream(){}    //私有无参构造方法
  11.     //该类必须自行创建
  12.     //有2种方式
  13.     /*private static final TestStream ts=new TestStream();*/
  14.     private static TestStream ts1=null;
  15.     //这个类必须自动向整个系统提供这个实例对象
  16.     public static TestStream getTest(){
  17.         if(ts1==null){
  18.             ts1=new TestStream();
  19.         }
  20.         return ts1;
  21.     }
  22.     public void getInfo(){
  23.         System.out.println("output message "+name);
  24.     }
  25. }
复制代码
  1. public class TestMain {
  2.     public static void main(String [] args){
  3.         TestStream s=TestStream.getTest();
  4.         s.setName("张孝祥");
  5.         System.out.println(s.getName());
  6.         TestStream s1=TestStream.getTest();
  7.         s1.setName("张孝祥");
  8.         System.out.println(s1.getName());
  9.         s.getInfo();
  10.         s1.getInfo();
  11.         if(s==s1){
  12.             System.out.println("创建的是同一个实例");
  13.         }else if(s!=s1){
  14.             System.out.println("创建的不是同一个实例");
  15.         }else{
  16.             System.out.println("application error");
  17.         }
  18.     }
  19. }
复制代码

运行结果:
  张孝祥
  张孝祥
  output message 张孝祥
  output message 张孝祥
  创建的是同一个实例
结论:由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。

参考:http://www.cnblogs.com/whgw/archive/2011/10/05/2199535.html


作者: 程浩    时间: 2014-4-10 11:31
本帖最后由 程浩 于 2014-4-10 11:32 编辑

IOS中的单例模式
  在objective-c中要实现一个单例类,至少需要做以下四个步骤:
  1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
  2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
  3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
  4、适当实现allocWitheZone,copyWithZone,release和autorelease。

下面以SurveyRunTimeData为例子:
1、synchronized 这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。
2、allocWithZone 这个是重载的,因为这个是从制定的内存区域读取信息创建实例,所以如果需要的单例已经有了,就需要禁止修改当前单例,所以返回 nil。
  1. static SurveyRunTimeData *sharedObj = nil; //第一步:静态实例,并初始化。
  2. @implementation SurveyRunTimeData
  3. + (SurveyRunTimeData*) sharedInstance  //第二步:实例构造检查静态实例是否为nil
  4. {
  5.     @synchronized (self)
  6.     {
  7.         if (sharedObj == nil)
  8.         {
  9.             [[self alloc] init];
  10.         }
  11.     }
  12.     return sharedObj;
  13. }

  14. + (id) allocWithZone:(NSZone *)zone //第三步:重写allocWithZone方法
  15. {
  16.     @synchronized (self) {
  17.         if (sharedObj == nil) {
  18.             sharedObj = [super allocWithZone:zone];
  19.             return sharedObj;
  20.         }
  21.     }
  22.     return nil;
  23. }

  24. - (id) copyWithZone:(NSZone *)zone //第四步
  25. {
  26.     return self;
  27. }

  28. - (id) retain
  29. {
  30.     return self;
  31. }

  32. - (unsigned) retainCount
  33. {
  34.     return UINT_MAX;
  35. }

  36. - (oneway void) release
  37. {
  38.    
  39. }

  40. - (id) autorelease
  41. {
  42.     return self;
  43. }

  44. - (id)init
  45. {
  46.     @synchronized(self) {
  47.         [super init];//往往放一些要初始化的变量.
  48.         return self;
  49.     }
  50. }
复制代码




作者: 陈志辉    时间: 2014-4-10 11:49
程浩 发表于 2014-4-10 11:31
IOS中的单例模式
  在objective-c中要实现一个单例类,至少需要做以下四个步骤:
  1、为单例对象实现 ...

好的,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2