单子模式

单子模式,顾名思义,就是在整个应用过程中只向外界提供唯一的一份实例。很多时候我们有这样的需求,譬如当我们在计算机上多次点击打开回收站或者某个PPT时,实际只会在我们面前呈现一个窗口。为啥?多开窗口浪费资源造成混乱。这就是单子模式的运用。单子模式的JAVA实现有两种形式,看代码:

 

package com.wepull.singleton;

 

/**

 * @author  kaixinguo饿汉式单例类

 */

public class EagerSingletion {

   private static EagerSingletion single = new EagerSingletion();

 

   private EagerSingletion() {

   }

 

   public static EagerSingletion getnSingInstance() {

      return single;

   }

}

package com.wepull.singleton;

 

/**

 * @author kaixinguo 懒汉式单例类

 */

public class LazySingletion {

   private static LazySingletion single;

 

   private LazySingletion() {

   }

 

   public static LazySingletion getnSingInstance() {

      if (single == null) {

         single = new LazySingletion();

      }

      return single;

   }

}

 

两种不同实现方式的区别:

<1> 从资源利用的角度看,懒汉式是在调用其静态方法的时候才被实例化的,所以要比饿汉式稍好一些。  

<2> 从反映时间和速度上看,饿汉式在类加载的时候就得到了初始化,所以要比懒汉式好一些。

由上可见,创建一个单子类必须满足以下三个条件:

1.构造器私有

2.自己持有自身的一个静态引用

3.对外面系统提供访问唯一实例的公共静态接口(方法).

 

下面我们看一个足够形象的例子,让大家对单子模式有更深刻的了解:

package com.wepull.singleton;

 

import javax.swing.*;

import java.awt.*;

 

/**

 * @author kaixinguo 单子模式类

 */

public class DemoSingleton extends JFrame {

   // 一个私有的,静态的本类对象

   private static DemoSingleton testFrame = new DemoSingleton();

   JLabel jLMes = new JLabel();

 

   // 构造必须是私有的,这样其它的类才不能访问

   private DemoSingleton() {

      getContentPane().setLayout(null);

      this.getContentPane().add(jLMes);

      this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

      jLMes.setText("这是产生的唯一窗体");

      jLMes.setBounds(new Rectangle(103, 53, 230, 96));

   }

 

   // 公有的静态方法返回一个本类对象

   public static synchronized DemoSingleton getInstance() {

      return testFrame;

   }

}

package com.wepull.singleton;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

/**

 * @author kaixinguo 测试类

 */

class Test extends JFrame {

   JButton jBtn = new JButton();

 

   public Test() {

      getContentPane().setLayout(null);

      jBtn.setBounds(new Rectangle(125, 182, 168, 43));

      jBtn.setText("单击产生唯一窗体");

 

      this.jBtn.addActionListener(new MyActionListener());

      this.getContentPane().add(jBtn);

      this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

      this.setSize(500, 300);

      this.setVisible(true);

   }

 

   class MyActionListener implements ActionListener {

      // 单击按钮时调用单子模式类的静态方法,获得一个对象

      public void actionPerformed(ActionEvent e) {

         DemoSingleton testFrame = DemoSingleton.getInstance();

         testFrame.setSize(300, 200);

         testFrame.setVisible(true);

 

      }

   }

 

   public static void main(String[] args) {

 

      Test test = new Test();

   }

 

}

上面我们在一个窗口里面设置了一个按钮,不管你点击多少次,它都只会弹出唯一的一份窗口实例。现在,大家知道什么叫单子模式了吧,希望大家继续关注我们独孤九剑系列,哈哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这句话是由一串十六进制编码组成的,需要先将其转化为可读的文本。转化后的文本是:“修改银行项目中的 bank 类来实现单子设计模式。” 针对这句话的回答是:实现单子设计模式需要修改银行项目中的 bank 类。 ### 回答2: 单例设计模式是一种保证某个类在整个系统中只有一个实例对象的设计模式。它有以下几个特点: 1. 单例类有一个私有构造函数,确保外部无法直接实例化对象; 2. 单例类拥有一个静态私有成员变量,用于存储单例对象; 3. 单例类拥有一个公共静态方法,用于获取单例对象。 在修改银行项目中的 bank 类来实现单子设计模式时,我们可以遵循以下步骤: 1. 将 bank 类的构造函数改为私有的,确保外部无法直接实例化 bank 对象。 2. 为 bank 类增加一个静态私有成员变量,用于存储 bank 对象。 3. 为 bank 类增加一个公共静态方法,用于获取 bank 对象。在该方法中,我们首先判断静态成员变量是否为空,如果为空,则创建一个 bank 对象,否则直接返回该对象。 以下是实现单例设计模式的修改代码: ```java public class Bank { private static Bank instance; private Bank() { // 确保外部无法直接实例化 bank 对象 } public static Bank getInstance() { if(instance == null) { instance = new Bank(); } return instance; } } ``` 这样,我们就成功地将 bank 类改为了单例设计模式。在整个系统中,bank 对象只有一个实例对象,可以节省内存空间并提高系统性能。同时,该类的实例化过程由 getInstance() 方法控制,外部无法直接实例化对象,更为安全。 ### 回答3: 单例设计模式(Singleton Design Pattern)是指在一个项目中只允许存在一个实例,该实例可在任何时候被访问。在银行项目中,可以使用单例设计模式来实现 bank 类,保证在整个项目中只有一个 bank 实例。 实现单例设计模式的关键在于将 bank 类构造函数声明为 private,这样就无法在类外部直接创建 bank 对象。然后,通过静态成员函数或静态变量来获取 bank 实例。 以下是一个示例代码: ```cpp class bank { private: // 将构造函数声明为 private,禁止在类外部创建 bank 对象 bank() {} static bank* instance; // 静态成员变量,用于存储唯一的 bank 实例 public: static bank* get_instance() { // 如果 bank 实例不存在,就创建一个新的 if (instance == NULL) { instance = new bank(); } return instance; } // 其它成员函数及数据成员 }; bank* bank::instance = NULL; // 静态成员变量需要在类外部初始化 int main() { bank* my_bank1 = bank::get_instance(); bank* my_bank2 = bank::get_instance(); cout << "地址1:" << my_bank1 << endl; cout << "地址2:" << my_bank2 << endl; // 判断两个 bank 对象是否相同,输出 true cout << (my_bank1 == my_bank2) << endl; return 0; } ``` 在这个示例中,我们将 bank 类的构造函数声明为 private,并使用静态成员变量 instance 来存储唯一的 bank 实例。在 get_instance() 函数中,如果 bank 实例不存在就创建一个新的,否则返回已有的实例。在 main 函数中,我们通过 get_instance() 函数获取两个 bank 对象,并判断它们是否相同。 使用单例设计模式可以避免在项目中创建多个 bank 实例,减少资源开销,同时也能更好地保护 bank 对象的数据安全性。需要注意的是,由于实例是静态变量,所以程序结束时需要手动释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值