设计模式-单例模式
一、概念
单例模式是创建型模式。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法,单例模式的要点有三个:
1.类只有一个实例
2.必须自行创建这个实例
3.自行向整个系统提供这个实例
二、角色
只有一个单例角色,在单例类内部实现并且只生成一个实例,同时提供一个静态方法的getInstance()工厂方法获取实例;为了防止在外部对其实例化,将其构造函数设计为私有,这样就不可以在外面直接new了
三、模板代码
public class Singleton { private static Singleton instance=null;//不会立刻创建对象,省得没用到浪费 private Singleton() { } //静态公有方法 public static Singleton getInstance() { if(instance==null)//不能用于多线程,如果都通过if进入,就可能出现创建多个实例的问题 instance=new Singleton(); return instance; } }
public class Singleton { //最简单的写法,缺点在于实例在类初始化的时候就创建了, //如果在整个项目中都没有使用到该类,就会创建内存空间的浪费。 private static Singleton instance=new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }
四、应用
身份证号码唯一,身份证卡重办也是唯一的身份证,此问题应用可以使用单例模式。
public class IdCard { private static IdCard instane=null; private String no;//号码 private IdCard() { } public static IdCard getInstance() { if(instane==null) { System.out.println("首次办理身份证,分配新号码"); instane=new IdCard(); instane.setNo("100865201314"); } else System.out.println("重复办理身份证,获取旧号码"); return instane; } private void setNo(String no) { this.no=no; } public String getNo() { return this.no; } }
public class Client { public static void main(String[] args) { IdCard x1,x2; x1=IdCard.getInstance(); x2=IdCard.getInstance(); //IdCard x3=new IdCard();//报错,不可以在外部构造 System.out.println("对象是否相同 x1==x2 "+(x1==x2));//x1和x2也是同一个类 String s1,s2; s1=x1.getNo(); s2=x2.getNo(); String s3=new String("100865201314"); System.out.println("内容是否相同 s1==s2 "+s1.equalsIgnoreCase(s2)); System.out.println("内容是否相同 s1==s3 "+s1.equalsIgnoreCase(s3)); System.out.println("对象是否相同 s1==s2 "+(s1==s2));//true 显然s1和s2指向的是同一片堆内存 System.out.println("对象是否相同 s1==s3 "+(s1==s3));//false } }
输出:
首次办理身份证,分配新号码
重复办理身份证,获取旧号码
对象是否相同 x1==x2 true
内容是否相同 s1==s2 true
内容是否相同 s1==s3 true
对象是否相同 s1==s2 true
对象是否相同 s1==s3 false