单例模式,最大使用,最大范围,什么,你的项目没用?功能主治:大量减小new运算,降低性能开销。
单例模式 Singleton
问题:
Application needs one, and only one, instance of an object. Additionally, lazy initialization and global access are necessary.
意图:
- Separate the construction of a complex object from its representation so that the same construction process can create different representations.
- Parse a complex representation, create one of several targets
代码
例1:实现1
package com.xdnote.DesignPattern.creational.signleton;
public class Singleton {
/**
* 私有构造器,防止被NEW
* */
private Singleton() {
System.out.println("Build a Object");
}
public static Singleton obj = null;
public static Singleton getInterface(){
if(obj==null){
obj = new Singleton();
}
return obj;
}
public void method(){
System.out.println("Run Method");
}
}
代码2:另一种实现
package com.xdnote.DesignPattern.creational.signleton;
public class Singleton2 {
private Singleton2() {
System.out.println("Build a Object");
}
private static class Provider {
private static final Singleton2 obj =new Singleton2();
}
public static Singleton2 getInterface(){
return Provider.obj;
}
public void method(){
System.out.println("Run Method");
}
}
代码3:客户端调用
package com.xdnote.DesignPattern.creational.signleton;
public class Client {
/**
* 超级简单的单例模式,这个也不用多说了,大家入门时都用过单例+工厂做过东西吧,这里提供了两种方法
* @param args
* 做用就不说了,看打出来的日志就知道,如果有多个地方需要一个对象时,可以减少new带来的性能损失
*/
public static void main(String[] args) {
//第一种是用常用的内部状态变量实现
Singleton obj1 = Singleton.getInterface();
obj1.method();
Singleton obj2 = Singleton.getInterface();
obj2.method();
Singleton obj3 = Singleton.getInterface();
obj3.method();
//另一种用个内部静态类
Singleton2 obj4 = Singleton2.getInterface();
obj4.method();
Singleton2 obj5 = Singleton2.getInterface();
obj5.method();
Singleton2 obj6 = Singleton2.getInterface();
obj6.method();
}
}
小结
单例模式 Singleton
- 使用频率:
极高
实在太多了,即可以单独使用,也可以配合在工厂或其它模式里面组合使用。可以说是只要程序中的一个对象不需要经常new或可以new之后就视为常量来使用时,就必须使用单例。
- 利弊影响:
极低
利:极度简单、省性能,只要在把new改为getInstance即可。
弊:比较小的情况下会出现数据异常,一般情况下比较好定位,但有些还是不好定位比如servlet.另外,菜鸟如果什么都用想着单例的话,可能会撑死内存。
- 小评:
简单实用,必备常识