GOF设计模式
Singleton Pattern
单子设计模式
• 有时候,我们需要实现这样的功能:那就是在整个应用中,只有一个实例存在。比如,在PowerPoint中,只能出现一个帮助窗口。如果将这个帮助窗口当作一个类,这就意味着它只能有一个实例。我们在以后会使用JDBC连接数据库程序,也可以使用该模式。
• 所谓类的单子(Singleton)设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类提供了一个取得其对象实例的方法。
单子模式第一种写法
• 步骤:
• 1.首先必须将类的构造方法的访问权限设置为private,这样,就不能用new 操作符在类的外部产生类的对象了。
• 2.在类的内部定义并产生那个唯一的对象,并限制其访问权限为private。
• 3.提供给外部一个public类型的静态方法,可以获得该唯一对象。
• 缺陷:在多线程不能正常工作。
public class Animal1 {
private Animal1(){
}
private static Animal1 animal1;
public static Animal1 getInstance1(){
if(animal1==null){
animal1=new Animal1();
}
return animal1;
}
}
public class Test1 {
public static void main(String[] args) {
Animal1 a=Animal1.getInstance1();
Animal1 b=Animal1.getInstance1();
System.out.println(a);
System.out.println(b);
}
}
单子模式第二种写法
(加了synchronized用来同步)
public class Animal2 {
private Animal2(){
}
private static Animal2 animal2;
public static synchronized Animal2 getInstance2(){
if(animal2==null){
animal2=new Animal2();
}
return animal2;
}
}
public class Test2 {
public static void main(String[] args) {
Animal2 a=Animal2.getInstance2();
Animal2 b=Animal2.getInstance2();
System.out.println(a);
System.out.println(b);
}
}
(运用内部类)
public class Animal3 {
private Animal3(){
}
private static class SingletonHolder{
private static final Animal3 instance=new Animal3();
}
public static Animal3 getInstance3(){
return SingletonHolder.instance;
}
}
public class Test3 {
public static void main(String[] args) {
Animal3 a=Animal3.getInstance3();
Animal3 b=Animal3.getInstance3();
System.out.println(a);
System.out.println(b);
}
}
(加了volatile和synchronized)
public class Animal4 {
private Animal4(){
}
private static volatile Animal4 animal4;
public static Animal4 getInstance4(){
if(animal4==null){
synchronized(Animal4.class){
animal4=new Animal4();
}
}
return animal4;
}
}
public class Test4 {
public static void main(String[] args) {
Animal4 a=Animal4.getInstance4();
Animal4 b=Animal4.getInstance4();
System.out.println(a);
System.out.println(b);
}
}