单例模式
什么是单例模式?
答:有些类在一整个软件体系中可能只能产生一个对象,就好比太阳系里面,太阳这个类只能实例化一个太阳,如果实例化两次就出问题了。所以限制一个类只能实例化一个对象,就是单例模式。
如何限制别人来new出新对象?
在java中,使用private修饰构造函数,限制外部不能调用构造函数,从而限制实例化。
而我们在类的内部直接new出想要的对象个数(单例模式就是1个对象)就可以了。
怎么实现?
java代码实现如下:(代码不正确,请往下看)
class Singleton{
private Singleton SINGLETON = new Singleton();
private Singleton(){}
}
会不会有问题?
会!现在Singleton内部的instance对象(属性)是一个普通属性,所有的普通属性必须在有实例化对象的时候才能进行内 存空间的分配,而现在外部无法产生实例化对象,所以必须想一个办法,可以在Singleton没有实例化对象产生的时 候,也可以将instance进行使用。此时,联想到使用static关键字,再写相应的get函数就好。
class Singleton{
private static final Singleton SINGLETON = new Singleton();
private Singleton(){}
public static Singleton getSINGLETON() {
return SINGLETON;
}
}
这也叫饿汉式单例。
还有懒汉式单例:区别在于第一次构造再实例化对象,但这个存在问题,在高并发情况下,有时候会产生两个对象,所以不建议使用!!!(当然也有解决方案,但比较复杂)
class Singleton2{
private static Singleton2 SINGLETON;
private Singleton2(){}
public static Singleton2 getSINGLETON() {
if (SINGLETON == null){
SINGLETON = new Singleton2();
}
return SINGLETON;
}
}
多例模式——有限个数对象
多例模式只是比单例模式多了一些内部实例化对象产生。
其实无论单例还是多例
- 构造方法私有化
- 类内部提供静态方法返回有限个数对象
就可以了
例子:
//多例模式
class Sex {
private String title ;
public static final int MALE_FLAG = 1 ;
public static final int FEMALE_FLAG = 2 ;
private static final Sex MALE = new Sex("男") ;
private static final Sex FEMALE = new Sex("女") ;
private Sex(String title) {
this.title = title ;
}
public static Sex getInstance(int flag) {
switch (flag) {
case MALE_FLAG:
return MALE ;
case FEMALE_FLAG:
return FEMALE ;
default:
return null ;
}
}
@Override
public String toString() {
return this.title ;
}
}