设计模式之单例模式(五种不同的写法)

设计模式的产生主要是使得软件能够更加的可维护、可扩展、可重用,增加软件的灵活性。
设计模式所涉及的七大原则有:
1.单一职责原则: 降低类的复杂度,一个类只负责一项职责,提高类的可读性,可维护性
2.接口隔离原则: 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小接口上
3.依赖倒置原则: 高层模块不依赖低层模块,二者都应该依赖其抽象,细节依赖抽象,核心思想是面向接口编程,实现方式有接口,构造器,setter方法。
4.里氏替换原则: 父类中实现的方法是在设定规范和契约,不要求子类必须遵循,但是子类对该方法任意修改,会对继承体系造成破坏,子类尽量不要重写父类方法,替换原则是使用聚合组合等关系解决继承的耦合性问题
5.开闭原则(open close principle): 一个软件模块或者一个类对扩展开放、对修改关闭,用抽象构建框架,用实现扩展细节。使得使用方的模块或类图尽可能少的更改
6.迪米特法则: 对象之间保持最少的了解,类之间耦合度尽可能的低,又称最少知道原则。耦合方式有:组合、聚合、依赖、关联,核心是降低类之间的耦合关系
7.合成复用原则: 尽量使用合成或者聚合的方式,避免使用继承
常见的单例模式的设计:

A.饿汉式(直接先创建对象,没有懒加载,会造成空间浪费)

//第一种类型--静态变量
class Singleton{
  //1.构造器私有化,外部能new
  private Singleton() {
  	
  }
  //2.本类内部创建对象实例
  private final static Singleton instance=new Singleton();
  //3.提供一个共有的静态方法,返回实例对象
  public static Singleton getInstance() {
  	return instance;
  }
}

//第二种类型--静态代码块
class Singleton2{
  //1.构造器私有化,外部能new
  private Singleton2() {
  	
  }
  //2.本类内部定义静态成员变量,在静态代码块中创建对象
  private  static Singleton2 instance;
  //在静态代码快中创建对象
  static {
  	instance=new Singleton2();
  }
  
  //3.提供一个共有的静态方法,返回实例对象
  public static Singleton2 getInstance() {
  	return instance;
  }
}

B.懒汉式(使用时创建对象,一般存在效率过低或者线程不安全的情况,不推荐使用)

//第一种类型--线程不安全
class Singleton3{
	private static Singleton3 instance;
	//1.构造器私有化,外部能new
	private Singleton3() {}
	//提供一个静态的公有方法,当使用到该方法时,才创建instance对象
	public static Singleton3 getInstance() {
		if(instance==null) {//多个线程同时访问可能会创建多个对象,实际中不适用
			instance=new Singleton3();
		}
		return instance;
	}
}

//第二种类型--线程安全同步方法(效率低)
class Singleton4{
	private static Singleton4 instance;
	//1.构造器私有化,外部能new
	private Singleton4() {}
	
	//提供一个静态的公有方法,当使用到该方法时,才创建instance对象
	public static synchronized Singleton4 getInstance() {//使用synchronized关键字保证线程同步
		if(instance==null) {
			instance=new Singleton4();
		}
		return instance;
	}
	
}

C.双重检查(Double-Check在静态公共方法中使用两次的判空操作检查)

class Singleton5{
	private static volatile Singleton5 instance;
	//1.构造器私有化,外部能new
	private Singleton5() {}
	//双重检查方法,提供静态的公有方法,加入双重检查代码,解决线层安全问题,同时解决懒加载问题
	public static  Singleton5 getInstance() {
		if(instance==null) {
			synchronized (Singleton5.class) {
				if(instance==null) instance = new Singleton5();
			}
		}
		return instance;
	}
	
}

D.静态内部类

静态内部类的特点:
单例模式使用了加载外部类成员时,没有使用静态内部类的成员或方法是,静态内部类不会加载,因此可以起到懒加载的目的;使用fina关键字修饰静态内部类的成员变量可以保证线程安全。

class Singleton6{
	//私有化构造器
	private Singleton6() {}
	//静态内部类,有一个静态属性Singleton6,静态内部类在加载原来的类时不会加载,因此可是实现懒加载
	private static class SingletonInstance{
		private static final Singleton6 INSTANCE = new Singleton6();
	}
	//提供静态公有方法,获取对象
	public static Singleton6 getInstance() {
		return SingletonInstance.INSTANCE;
	}
	
}

E.枚举

enum Singleton7{
	INSTANCE;//属性
	public void sayOk() {
		System.out.println("ok");
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值