设计模式笔记(5)
2018-05-29 本文已影响0人
球球球球笨
单例模式
实例化一个对象这件事情都是类本身来完成的,不应该听从于外部程序。
public class Wife {
private static Wife wife;
private wife() {
...
}
public static Wife GetInstance()
{
if(wife == null) wife = new Wife();
return wife;
}
public void show(){}
public void marry() {}
}
GOF对单例模式的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
客户端代码如下:
public static void main(String[] args)
{
Singleton singletonA = Singletion.GetInstance();
Singleton singletonB = Singletion.GetInstance();
if(singletonA == singletonB)
{
same
}
}
"=="对于值类型会判断其值是否相等,对于引用类型会判断引用(内存地址)是否相同,也就是判断是否是同一个对象
线程安全性
引入锁的概念。Lock类,作用为构造一块临界区来控制线程对于代码的访问,确保每次只有一个线程运行到临界区的代码,其他的线程运行到临界区时,将会一直等待直到前面的线程运行出临界区为止。
加锁后的wife类
public class Wife {
static Lock lock = new ReentranLock();
private static Wife wife;
private wife() {
...
}
public static Wife GetInstance()
{
lock.lock();
if(wife == null) wife = new Wife();
lock.unlock();
return wife;
}
public void show(){}
public void marry(){}
}
改良后
public static Wife GetInstance()
{
if(wife == null) {
lock.lock();
wife = new Wife();
lock.unlock();
}//缩小了临界区
return wife;
}
再改良
public static Wife GetInstance()
{
if( wife == null ) {
lock.lock();
if( wife == null ) {
wife = new Wife();
}
lock.unlock();
}//缩小了临界区
return wife;
}
以下情况适用于单例模式
- 当类只能有一个实例且第三方可以从一个公共的访问点访问它时
- 当一个唯一的实例可以通过子类化来拓展,而且第三方需要在不更改代码的情况下就能使用一个拓展的实例时。