导读:单例模式.一、模式动机.单例模式(Singleton Pattern)是结构最简单的设计模式,它的核心结构中只包含一个被称为单例类的特殊类.。通过单例模式可以确保系统中一个类只有一个实例 ,且该实例易于被外界访问,从而方便对实例个数的控制并节约系统资源。.如何确保一个类只有一个实
单例模式(Singleton Pattern)是结构最简单的设计模式,它的核心结构中只包含一个被称为单例类的特殊类 。通过单例模式可以确保系统中一个类只有一个实例 ,且该实例易于被外界访问,从而方便对实例个数的控制并节约系统资源。
单例类:
public class Singleton {
//静态私有成员变量
private static Singleton instance=null;
//私有构造函数
private Singleton() {
}
//静态公有工厂方法,返回唯一实例
public static Singleton getInstance() {
if(instance==null)
instance=new Singleton();
return instance;
}
}
身份证
单例类
public class IdentityCardNo {
private static IdentityCardNo instance = null;
private String no;
private IdentityCardNo() {
}
public static IdentityCardNo getInstance(){
if (instance == null){
System.out.println("第一次办理身份证,分配新号码");
instance = new IdentityCardNo();instance.setNo("No10086111");
}else
System.out.println("重复办理身份证,获取旧号码");
return instance;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
}
测试类
public class Client {
public static void main(String[] args) {
IdentityCardNo no1,no2;
no1 = IdentityCardNo.getInstance();
no2 = IdentityCardNo.getInstance();
System.out.println("身份证号码是否一致"+(no1 == no2));
String str1,str2;
str1 = no1.getNo();
str2 = no2.getNo();
System.out.println("第一次号码:"+str1);
System.out.println("第二次号码:"+str2);
System.out.println("内容是否相等:"+str1.equalsIgnoreCase(str2));
System.out.println("是否是相同对象:"+(str1 == str2));
}
}
单例模式的目的
实现单例模式的思想
单例模式的问题
饿汉式(Eager Singleton):顾名思义,该模式在类被加载时就会实例化一个对象。
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() { }
public static EagerSingleton getInstance() {
return instance;
}
}
懒汉式(Lazy Singlenton):该模式只在你需要对象时才会生成单例对象(比如调用getInstance方法)
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
关于Synchronized 类型的方法
锁方法:
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }
synchronized public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
锁代码段
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
instance = new LazySingleton();
}
}
return instance;
}
懒汉式与饿汉式比较
| 懒汉式 | 饿汉式
实例化 | 外部调用时 | 类加载时 |
线程安全 | 不安全 | 安全 |
执行效率 | 较低 | 较高 |
内存 | 不浪费 | 浪费 |
使用单例模式的思想可以实现多例模式,从而确保系统中某个类的对象只能存在有限个
单例类
//单例模式实现多例,实现3个
public class Multiton {
private static ArrayList<Multiton> array = new ArrayList<>();
private Multiton() {
}
public static Multiton getInstance(){
if (array.size() < 3){
System.out.println("创建实例成功");
Multiton multiton = new Multiton();
array.add(multiton);
return multiton;
}else {
System.out.println("不再创建更多实例");
return array.get(new Random().nextInt(array.size()));
}
}
public int random() {
int rand = (int) (Math.random()*3);
return rand;
}
}
客户测试类
public class Client {
public static void main(String[] args) {
Multiton m1 = Multiton.getInstance();
Multiton m2 = Multiton.getInstance();
Multiton m3 = Multiton.getInstance();
Multiton m4 = Multiton.getInstance();
System.out.println("m1=m2"+(m1 == m2));
System.out.println("m2=m3"+(m2 == m3));
System.out.println("m3=m4"+(m3 == m4));
}
}
上一篇:Git操作笔记
下一篇:造成通信频段的变化的原理