单身模式小结
前序
?
模式其实就是指被实践证明了的对常规问题的有效解决方案,比如说我国的明太祖朱元在建立大明之前,所采纳的其谋士朱升提出的成功策略(即等同于我们这里我说的“模式”)—“高筑墙、广积粮、缓称王”,这就是一种极具战略眼光的斗争“模式”。
设计模式—esign Pattern)属于系统分析设计范畴,在面向对象的软件设计和开发中占据着非常重要的地位,好的设计模式可以使我们更加方便地重用已有的成功设计和体系结构,进而极大地提高代码的重用性和可维护性。
设计模式并不涉及新的语法规则,而是对现有规则的典型运用。
?
?
Singleton设计模式
概述
Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。
从另一个角度来说,Singleton模式其实也是一种职责型模式。因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责!
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
举例?
public class Singleton
{
? //定义实例变量name和类成员single
?private String name;?
?private static Singleton single;
?
?//为了避免生成类的多个实例,将类的构造方法定义成为private
?private Singleton(){};
?
? //类的getter()和setter()方法
?public void setName(String name)
? {
?? this.name = name;
?}?
?public String getName()
? {
??return name;
?}
?
?//生成类的实例,并且仅在第一次使用时生成
?//由于不能直接生成对象,所以getSingle()只能是类方法
?public static Singleton getSingle()
? {
??if(single == null)
??{
?? ?single = new Singleton();
?? }
?? return single;??
? }
?
? //验证设计的正确性
?public static void main(String[] args)
?{
??//生成实例instanceA,用户名为Tom
?? Singleton instanceA = Singleton.getSingle();
?? instanceA.setName("Toms");
? ?System.out.println("instanceA of Name:"+instanceA.getName());
??
?? //生成第二个实例instanceB
?? Singleton instanceB = Singleton.getSingle();?
??//如果输出Toms,则说明Singleton只生成了一个对象,istanceA和instanceB是同一个实例
??System.out.println("instanceB of Name:"+instanceB.getName());??
?}
}
?
运行结果
instanceA of Name:Toms
instanceB of Name:Toms
?小结
Singleton类的实例只在第一次需要的时候才创建,与普通类的实例相比,会相对节省点系统资源。这种到使用时才进行对象创建和初始化的方式称为迟钝初始化(Lasy Initializtion)。在多线程应用中,迟钝初始化可能会导致多个实例并存的问题,因此在多线程环境下应避免使用。