设计模式之单模式 Singleton pattern

来源:互联网 发布:服务器免流软件 编辑:程序博客网 时间:2024/05/01 06:39

    单模式要求类提供一个实例,访问该类必须通过同一实例,即一个类有具只有一个实例。示例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();
}

原创粉丝点击