介绍
创建型模式 有些对象只需创建少量且固定个数的即可,重复创建对象会导致程序运行效率降低。,因为创建对象是耗时操作。 该模式根据创建对象时机的不同分为懒汉式 、饿汉式
运用
单例模式的核心是:构造方法私有,向外部提供一个接口,用以获取单例对象。
private Demo ( ) { }
private static Demo demo = new Demo ( ) ;
public static Demo getInstance ( ) {
return demo;
}
private static Demo demo;
public static Demo getInstance ( ) {
if ( demo == null ) demo = new Demo ( ) ;
return demo;
}
以上的操作,将导致线程不安全。试想一下,当A线程刚判断完,demo为空将要创建对象时,B线程也进行了判断,判断也为空,该线程也会进行创建对象的操作。那么,最终的结果就是创建了多个对象,与初衷不符。 解决方案:
private static volatile Demo demo;
public static synchronized Demo getInstance ( ) {
if ( demo == null ) demo = new Demo ( ) ;
return demo;
}
单例模式不意味着只创建一个对象,而是固定个数的、有限的对象。 对象池-饿汉式
import java. util. ArrayList ;
import java. util. List ;
public class Demo {
private static int number = 3 ;
private Demo ( ) { }
private static List < Demo > listOfDemo = new ArrayList < > ( ) ;
static {
for ( int i = 1 ; i <= number; ++ i) {
listOfDemo. add ( new Demo ( ) ) ;
}
}
public static Demo getInstance ( ) {
if ( listOfDemo. size ( ) > 0 ) return listOfDemo. remove ( listOfDemo. size ( ) - 1 ) ;
else return null ;
}
public void close ( ) {
if ( listOfDemo. size ( ) == number) return ;
listOfDemo. add ( this ) ;
}
}
public class User {
public static void main ( String [ ] args) {
Demo demo1 = Demo . getInstance ( ) ;
Demo demo2 = Demo . getInstance ( ) ;
Demo demo3 = Demo . getInstance ( ) ;
Demo demo4 = Demo . getInstance ( ) ;
System . out. println ( demo1) ;
System . out. println ( demo2) ;
System . out. println ( demo3) ;
System . out. println ( demo4) ;
if ( demo1 != null ) demo1. close ( ) ;
System . out. println ( "demo1: " + demo1) ;
Demo demo5 = Demo . getInstance ( ) ;
System . out. println ( demo5) ;
}
}
结果:
Demo @4f3f5b24
Demo @15aeb7ab
Demo @7b23ec81
null
demo1: Demo @4f3f5b24
Demo @4f3f5b24
值得注意的是,在demo.close();
执行之后,我并没有demo = null;
,因为过期引用的销毁最好不要手动编写代码去实现,而是由其生命周期决定。 对象池-懒汉式
import java. util. ArrayList ;
import java. util. List ;
public class Demo {
private static int number = 3 ;
private static int current = 0 ;
private Demo ( ) {
}
private static List < Demo > listOfDemo = new ArrayList < > ( ) ;
public static Demo getInstance ( ) {
if ( number > listOfDemo. size ( ) + current) {
listOfDemo. add ( new Demo ( ) ) ;
}
if ( current < number) {
current++ ;
return listOfDemo. remove ( listOfDemo. size ( ) - 1 ) ;
}
return null ;
}
public void close ( ) {
if ( listOfDemo. size ( ) == number) return ;
listOfDemo. add ( this ) ;
current-- ;
}
}
结果:
Demo @4f3f5b24
Demo @15aeb7ab
Demo @7b23ec81
null
demo1: Demo @4f3f5b24
Demo @4f3f5b24