设计模式之单模式 Singleton pattern

本文介绍单例模式的两种实现方式:一是确保类只有一个实例并提供全局访问点;二是采用延迟创建,利用另一个类来完成对象的创建。文章通过具体Java代码示例详细解释了如何实现这些方法,并强调了构造函数的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值