模式摘要
PS:紫色和蓝色的字为原书的话
《设计模式解析》一书中提到的建筑师Christopher Alexander对模式的定义:“在某一背景下某个问题的一种解决方案!”。它说,一个模式的描述应该包括:
- 模式的名称
- 模式的目的,即要解决的问题
- 实现方法
- 为了实现该模式我们必须考虑的限制和约束因素
Singleton模式和Double-Checked Locking模式
模式的名称:Singleton & Double-Checked Locking
模式的目的:保证一个类仅有一个实例,并提供一下访问它的全局访问点。即,希望对象只有一个实例,但没有控制对象实例化的全局对象。还希望确保所有实体使用该对象相同的实例,而无需将引用传给它们。
实现:
- 添加一个类的私有的静态成员变量,引用所需的对象(初值为null)。
- 添加一个公共的静态方法,它在成员变量的值为null时实例化这个类(并设置成员变量的值),然后返回该成员变量的值。
- 将构造方法的状态设置为保护或私有,从而访止任何人直接实例化这个类,绕过静态构造方法机制。
代码示例:项目中,如果有一个系统的工厂类,或者是数据库工厂类,通常这个工厂模式中会用到单件模式(Singleton)
代码一(JAVA - Singleton):单线程
public
class
SimpleFactory
...
{
private static SimpleFactory factory = null;
private SimpleFactory() ...{
}
public static SimpleFactory getInstance() ...{
if(factory == null)
factory = new SimpleFactory();
return factory;
}
}
private static SimpleFactory factory = null;
private SimpleFactory() ...{
}
public static SimpleFactory getInstance() ...{
if(factory == null)
factory = new SimpleFactory();
return factory;
}
}
代码二(JAVA - Singleton):多线程1(设计模式解析中推荐)
public
class
SimpleFactory
...
{
private SimpleFactory() ...{
}
public static SimpleFactory getInstance() ...{
return Factory.factory;
}
/** *//**
* 用类来装载SimpleFactory的唯一的实例
*/
private static class Factory ...{
static final SimpleFactory factory = new SimpleFactory();
}
}
private SimpleFactory() ...{
}
public static SimpleFactory getInstance() ...{
return Factory.factory;
}
/** *//**
* 用类来装载SimpleFactory的唯一的实例
*/
private static class Factory ...{
static final SimpleFactory factory = new SimpleFactory();
}
}
代码三(JAVA - Double-Checked Locking):多线程2
public
class
SimpleFactory
...
{
private static SimpleFactory factory = null;
private SimpleFactory() ...{
}
public static SimpleFactory getInstance() ...{
if (factory == null) ...{
synchronized(this) ...{
if (factory == null) ...{
factory = new SimpleFactory();
}
}
}
return factory;
}
}
private static SimpleFactory factory = null;
private SimpleFactory() ...{
}
public static SimpleFactory getInstance() ...{
if (factory == null) ...{
synchronized(this) ...{
if (factory == null) ...{
factory = new SimpleFactory();
}
}
}
return factory;
}
}
调用都是一致的
public
static
void
main(String[] args)
...
{
SimpleFactory factory = SimpleFactory.getInstance();
}
SimpleFactory factory = SimpleFactory.getInstance();
}