单态定义:
Singleton模式主要做用是保证在Java应用程序中,一个类Class只有一个实例存在。 java
在不少操做中,好比创建目录 数据库链接都须要这样的单线程操做。数据库
还有, singleton可以被状态化;这样,多个单态类在一块儿就能够做为一个状态仓库同样向外提供服务,好比,你要论坛中的帖子计数器,每次浏览一次须要计数,单态类可否保持住这个计数,而且能synchronize的安全自动加1,若是你要把这个数字永久保存到数据库,你能够在不修改单态接口的状况下方便的作到。安全
另外方面,Singleton也可以被无状态化。提供工具性质的功能,Singleton模式就为咱们提供了这样实现的可能。使用Singleton的好处还在于能够节省内存,由于它限制了实例的个数,有利于Java垃圾回收(garbage collection)。ide
咱们经常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,由于被装入的类实际也属于资源。工具
public class SingletonA { public static boolean instanceFlag = false; //true if 1 instance //private SingletonA instance; private int i = 0; // Set constructor private and do nothing // Can not new a instance outside class private SingletonA() { } public int getNum() { return i; } public void setNum() { i++; } public static SingletonA getInstance() { if(! instanceFlag) { instanceFlag = true; return new SingletonA(); } return null; } public void finalize() { instanceFlag = false; } }
测试A测试
public class TestA { public static void main(String[] args) { // Can not create a instance ! //SingletonA instance1 = new SingletonA(); SingletonA instance2 = SingletonA.getInstance(); if(instance2 != null) { instance2.setNum(); System.out.println("i is:" + instance2.getNum()); } SingletonA instance3 = SingletonA.getInstance(); if(instance3 == null) { System.out.println("Can not get instance twice !"); } } }
实例2this
public class SingletonB { static private Hashtable registry = new Hashtable(); //static private SingletonB instance; public static void Register(String name, SingletonB aInstance) { registry.put(name, aInstance); } public static SingletonB GetInstance(String name) { return LookUp(name); } protected static SingletonB LookUp(String name) { return (SingletonB)registry.get(name); } }
public class SubSingletonB extends SingletonB { public static boolean instanceFlag = false; //true if 1 instance //private int i = 0; public SubSingletonB() throws SingletonException { if(instanceFlag) { throw new SingletonException("Only can create a instance !"); } else { instanceFlag = true; super.Register("Sub1", this); } } public void finalize() { instanceFlag = false; } }
public class SingletonException extends RuntimeException { public SingletonException() { super(); } public SingletonException(String s) { super(s); } }
测试2.。spa
public class TestB { public static void main(String[] args) { // First we get a instance from SingletonB SingletonB instance1 = SingletonB.GetInstance("Sub1"); if(instance1 == null) { System.out.println("There is no such instance in registry !"); } else { System.out.println(instance1.getClass()); } // Then we register a new instance try { SingletonB instance2 = new SubSingletonB(); System.out.println("We had created a new instance named \"Sub1\" now"); } catch (SingletonException e) { System.out.println(e.getMessage()); } // To get instance again instance1 = SingletonB.GetInstance("Sub1"); if(instance1 == null) { System.out.println("There is no such instance in registry !"); } else { System.out.println(instance1.getClass()); } // Finally we create a new instance again try { SingletonB instance3 = new SubSingletonB(); System.out.println("We had created a new instance named \"Sub1\" now"); } catch (SingletonException e) { System.out.println(e.getMessage()); } } }
结果线程
There is no such instance in registry !code
We had created a new instance named "Sub1" now
class corner.dp.create.Singleton.SubSingletonB
Only can create a instance !