系统中为了节约内存资源,保证内容数据一致性,对一些类要求只能创建一个实例,这就是单例模式。
定义和特点
singleton单例定义:指一个类只能有一个实例对象。比如公司董事长,总经理,就可比喻成单例模式,因为一个公司只存在一个这样的实例。
特点:
1,单例模式只有一个实例对象。
2,该单例对象必须有单例类自行创建。
3,单例类对外提供一个访问该单例的全局访问点。
优缺点
优点:·保证内存中只有一个实例,减少内存开销。
·避免对资源的多重占用。
·单例模式设置全局访问点,可优化和共享资源访问。
缺点:·单例模式一般没有接口,扩展比较困难。如果要扩展,要修改原来的代码,违背开闭原则。
·并发中,单例模式不利于代码调试。在调试过程中如果单例中代码没有执行完,不能模拟生成新对象。
·单例模式的功能代码通常写在一个类中,如果功能设计不合理,就很容易违背单一职责原则。
实例如下
singleton分为两种模式 懒汉式和饿汉式。
懒汉式:特点是在类加载时没有生成单例,只有当第一次调用方法时才去创建这个单例。
public class LazySingleton {
private static volatile LazySingleton instance = null; //保证 instance 在所有线程中同步
private LazySingleton() {//private 避免类在外部被实例化
}
public static synchronized LazySingleton getInstance() {
//getInstance 方法前加同步
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
注意:如果是多线程编程,就不用删除volatile 和synchronized 关键字,不然会存在线程安全问题,但是每次访问都要同步,影响性能,消耗更多资源,这也是懒汉式的缺点。
饿汉式:特点是类在加载时就创建了一个实例。
public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
饿汉式在创建类的时候就创建了静态对象,以后不会改变,所以是线程安全的,多线程下也不会出现问题。