黑马程序员技术交流社区
标题: 单例模式 [打印本页]
作者: yaozeyang_2014 时间: 2014-4-26 20:01
标题: 单例模式
本帖最后由 yaozeyang_2014 于 2014-5-7 10:33 编辑
什么是单例设计模式?是用类方法(静态方法)快速创建对象的意思吗?最好有例子。。感谢!!
作者: cnchenys 时间: 2014-4-26 20:14
本帖最后由 cnchenys 于 2014-4-26 20:33 编辑
单例设计模式(singleton)就是不管你创建多少个对象,都指向同一块内存.即整个程序运行中,该对象只有一份.一般重量级(占用大量内存)而且仅需一份的对象,都会用单例设计模式设计.JAVA中也有单例设计模式,JAVA种只要private构造方法,再写一个instance方法,判断是否已存在,不存在则new. OC种也类似,单还要考虑计数器,所以OC种稍微麻烦点:
完成思路是提供一个实例化方法,
+ (Single *)instance{
@synchronized(self){ // 线程安全
if(!instance){
/* 这里不是使用alloc,而是调用[[super allocWithZone:NULL] init ] ,为什么是super而不是self呢?
这是因为已经在self中冲在了基本对的分配方法,所以需要借用父类的(NSobject)的功能帮助处理底层内存分配的杂务;
*/
instance = [[super allocWithZone:NULL] init];
}
}
return instance;
}
并重写NSObject种的一些方法:
/ 覆盖NSObject方法
+ (id)allocWithZone: (struct _NSZone * )zone{
return [[self instance] retain];
}
- (id)copyWithZone: (NSZone * )zone{
return self;
}
- (id)retain{
return self;
}
- (NSUInteger)retainCount{
return UINT_MAX; // 无穷大的数,表示不能释放
}
- (id)autorelease{
return self;
}
- (oneway void)release{
}
作者: 李鹏-ios 时间: 2014-4-26 22:35
单例模式是一种软件编码过程中的设计模式,面向对象的语言如java,oc,C#,都可以实现这种设计模式,其实就是一种编码方式。这种编码方式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点。我的OC正在学习,所以只能提供java代码了,我先实现思路应该类似的
public class Singleton{
private static Singleton instance=null; //在自己的类内部实现一个静态的实例
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton(); //只有instance空的时候才会新建一个实例
}
return instance;
}
}
作者: gaoxinglei123 时间: 2014-4-26 22:57
单例模式是一种设计模式。主要就是一个类只能创建一个内存实例。java中是通过私有化构造方法来实现的。
作者: gmadong@163.com 时间: 2014-4-27 10:15
- 单例设计模式就是保证系统只有一个实例而且该实例易于外界访问
- //.h文件
- @interface Singleton : NSObject
- +(instancetype) sharedInstance;
- @end
- //.m文件
- @interface Singleton ()
- @end
- static Singleton *_singleton;
- @implementation Singleton
- +(instancetype) sharedInstance//快速得到对象方法
- {
- if(_singleton==nil)
- {
- _singleton = [[Singleton alloc]init];
- }
- return _singleton;
- }
- +(id)allocWithZone:(struct _NSZone *)zone//重写使用GCD保证只执行一次
- {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- _singleton = [super allocWithZone:zone];
- });
- return _singleton;
- }
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |