Singleto
n单例模式是保证一个类有且仅有一个实例,并且提供全局的访问点
,用于解决设计的程序包含大量实例时,往往要保证一个类中只能有一个实例。但是单例类很难生成子类,因为在单例基类没有实例化是才有效。很容易对单例修改为非单例使其在特定项目下可有多个实例。
一、使用类的静态方法,这也是最常用的方法:
(1)定义类的静态对象:
public class PrintSpooler {
//a prototype for a spooler class
//such that only one instance can ever exist
private static PrintSpooler spooler;
...
}
(2)定义类的构造函数为private类型:
private PrintSpooler() {
}
(3)编写提供类对象的全局访问点的静态方法:
public static synchronized PrintSpooler getSpooler() {
try{ if (spooler == null)
spooler = new PrintSpooler();
++count;
Thread.sleep(500);
return spooler;
}
catch(Exception e){
e.printStackTrace();
}
return null;
}
声明为static表示属于类而不是对象,限制获得多个对象的情况,
声明为同步,表示此Class在不同线程中调用该方法的序列是同步的。
(4)获取对象:
PrintSpooler spl = PrintSpooler.getSpooler ();
spl.print ("Printing data:");
spl.print ("I am spooler1,the count number is:"+PrintSpooler.count);
PrintSpooler.count+=5;
PrintSpooler spl2 = PrintSpooler.getSpooler ();
spl2.print ("I am spooler2,the count number is:"+PrintSpooler.count);
其中spl2获取的是和spl一样的对象,因为在getSpooler中对对象是否存在进行检查,限制只有一个对象存在。
二、在程序的一开始创建所有的单例,然后将单例传递给需要单例的主类。
prl=new Spooler();
Customers cust=new Customers(prl);
这样做的缺点是,对于一次特定的程序执行,可能不需要创建全部的单例,因此这样会很明显的降低性能。
三、单例类创建一个注册表:
为该程序的所有单例类创建一个注册表,并使该注册表总是可用的,每次实例化一个单例时,则将此记录在注册表中。这样程序的任何部分都可以使用一个指定的字符串请求任何单例的实例,并返回该实例变量。
注册表方法的缺点是类型检查被弱化了,因为注册表中的单例表可能把所有的单例都保存为对象,例如保存在一个Hashtable对象中。当然,注册表本身也许就是一个单例,必须使用具有各种设置功能的构造函数将其传递到程序的各个部分,这样增加了复杂性。
四、基于类的静态方法的javax.comm包
,没有在SDK中要到网上去下载(可以到CSDN),这个类专门设计用来控制计算机的串口和并口。没种平台都有这个包的不同实现,因为它必须包含处理实际系统硬件的本地代码(native code).
在使用它的时候可能存在两个类的单例,一个是管理端口集合对象,确保每个端口只有一个实例;一个是管理端口对象本身,确保每个端口只能对应一个对象。
1.javax.comm中的CommPortIdentifier类和getPortIdentifiers方法
CommPortIdentifier类有一个静态方法getPortIdentifiers(),返回Enumeration类型的CommPortIdentifier端口单例,一个串行端口是可以有多个实例对象的,但是任意时刻只能由一个实例对象打开,所以可以看作打开的端口实例是单例的。使用getPortIdentifiers返回所有的单例端口:
public static Enumeration getAllPorts() {
CommPortIdentifier portId;
Enumeration portEnum;
Vector ports = new Vector();
portEnum = CommPortIdentifier.getPortIdentifiers();
while (portEnum.hasMoreElements()) {
portId = (CommPortIdentifier) portEnum.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
ports.addElement (portId.getName());
}
}
//add bogus port
ports.addElement("COM5");
return ports.elements (); //return enumeration
}
2.封装了javax.comm 的CommPortIdentifier的CommPortManager类:
public abstract class PortManager {
public static Enumeration getAllPorts() {return null;};
public static Enumeration getAvailablePorts(){return null;};
public static CommPort openPort(String portName){return null;};
public static CommPort openPort(){return null;};
}
getAvailablePorts()方法:
public static Enumeration getAvailablePorts() {
Vector portOpenList = new Vector();
CommPortIdentifier portId;
Enumeration enumeration= getAllPorts();
while (enumeration.hasMoreElements ()) {
String portName = (String)enumeration.nextElement () ;
try {
//try to get port ownership
portId = CommPortIdentifier.getPortIdentifier(portName);
//if successful, open the port
CommPort cp = portId.open("SimpleComm",100);
//report success
portOpenList.addElement(portName);
cp.close();
}
catch(NoSuchPortException e){}
catch(PortInUseException e){}
}
return portOpenList.elements ();
}
封装了javax.comm 的CommPortIdentifier的CommPortManager类仅是开发中便于对内部异常进行处理,重要的还是
CommPortIdentifier方法,它可用被看成是一个单例注册表,因为它提供了一个获得不同单例的全局访问点。
如,COM1,COM2,COM3,COM4的访问。
五、其它结论:
1.对一个单例生成子类很困难,因为只有在基单例类未被实例化时才能奏效。
2.很容易对单例加以修改,从而在允许和有意义的情况下可以有多个实例。
分享到:
相关推荐
java设计模式,单例模式的不同实现方式
设计模式之单例模式。Java代码实现。五种实现方式
单例模式是最简单的一种设计模式,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例, 本资源提供了用java语言实现简单的单例模式,供初学者参考
简单的单例模式举例Singleton 分为恶汉式 懒汉式
Java面向对象(高级)-- 单例(Singleton)设计模式
在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...
工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的...
//单例模式,始终只产生一个对象 /*public class SingleTest { public static void main(String[] args) { SingleTon singleTon1=SingleTon.getInstance(); SingleTon singleTon2=SingleTon.getInstance(); ...
java 三种设计模式Demo 其中对单例模式做了详细的讲解,及性能和线程安全方面的优化其中Singleton.java为经典单例模式。
通过对配置文件进行读写的例子,演示了如何应用单例模式来设计类及其之间的关系。
Java中单例模式的定义是:一个类只有一个实例,而且自行实例化并且向整个系统提供这个实例。 优点:由于单例模式在内存中只有一个实例,减少了内存开支和系统的性能开销;单例模式可以避免对资源的多重占用。 ...
Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在...
单例模式(Singleton Pattern)是 Java 中最常见的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo
基于观察者模式和单例模式的java聊天室 面向对象设计,抽象,封装,代理,组合和继承 适合理解java面向对象,socket编程,观察者模式和单例模式
JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在
Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...
- 23种设计模式 - 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰...