单模式要求类提供一个实例,访问该类必须通过同一实例,即一个类有具只有一个实例。示例java代码:
1.比较常用的一种实现单模式的方法
Connection.java
public class Connection {
private static Object forSyn = new Object();
public static Connection m_Connection = null;
public static Connection getInstance() {
synchronized (forSyn) {//使用synchronized实现线程同步,
//避免访问资源冲突而产生的错误
if (m_Connection == null)
m_Connection = new Connection();
}
return m_Connection;
}
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void Connect2DataBase() {
System.out.println("连接到" + type);
}
}
测试单模式Program.java
public class Program {
public static void main(String[] args) {
Connection conn = Connection.getInstance();
conn.setType("oracle");
conn.Connect2DataBase();
Connection conn2 = Connection.getInstance();
conn.setType("ms-sql");
System.out.println(conn==conn2);//输出true,由于使用单模式获
//得对象所有相等
conn.Connect2DataBase();
conn2.Connect2DataBase();
}
}
上面的代码似乎已经实现了单模式,可大家别忘了我们的要求(一个类有且只有一个实例),这就是说所有Connection类的访问示例必须通过getInstance()方法获取;然而通过以上方法我们虽然能够通过getInstance()访问类Connection但是并不能保证所有所有的访问都是同一实例,因为我们可以通过Connection conObj=new Connection()来创建Connection类的实例。所以还得对代码做一定的修改,怎么修改呢。就是将Connection的构造函数改为private使其不能在类的外部被实例化,代码如下:
public class Connection {
private static Object forSyn = new Object();
public static Connection m_Connection = null;
private Connection(){}//使其不能在类的外部被实例化
public static Connection getInstance() {
synchronized (forSyn) {//使用synchronized实现线程同步,
//避免访问资源冲突而产生的错误
if (m_Connection == null)
m_Connection = new Connection();
}
return m_Connection;
}
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void Connect2DataBase() {
System.out.println("连接到" + type);
}
}
当然还有其他修改的方法(如使用final关键字等),在此不一一列举。
2. 延迟创建也较常用,这种实现方法把对像的创建工作交给另一个类去完成:
1) DelaySingleton.java
public class DelaySingleton {
private String name;
public static DelaySingleton getInstance()
{
return SingtonCreate.m_DelaySingleton;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2) SingtonCreate.java
public class SingtonCreate {
public static DelaySingleton m_DelaySingleton=new DelaySingleton();
}