动机:对于一些类来说,只有一个实例是很重要的。
系统中可以有很多打印机,但却只应该又一个打印假脱机,只应又一个文件系统和一个窗口管理器。为了防止实例化多个对象,让这个类自身负责保存它的唯一实例,保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法,这就是Singleton模式。
适用性:
- 当类只能有一个实例且客户可以从一个众所周知的访问点访问它时
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无须更改代码就能使用一个扩展的实例时。
优点:
- 对唯一实例的受控访问
- 缩小名字空间(是对全局变量的一种改进)
- 允许操作和表示的精华
- 允许可变数目的实例
- 比类操作更灵活
实现
饿汉式
public class singleton{
public static void main(String[] args){
}
}
class printerspooler{
//私有化构造器
private printerspooler(){
}
//内部创建类的对象,要求次对象必须声明为静态的
private static printerspooler instance = new printerspooler();
//提供公共的方法,返回类的对象
public static printerspooler getInstance(){
return instance;
}
}
懒汉式(线程不安全)
class Order{
//私有化类的构造器
private Orider(){
}
//声明当前类对象没有初始化,必须为static
private static Order install = null;
//声明public、static 返回当前类对象的方法
public static Order getInstance(){
if(instance == null){
instance = new Order();
}
return instance;
}
}
参考:设计模式-埃里克·伽马