• 单子模式


    看过请留个言,转载请注明出处,尊重作者劳动成果,谢谢!

     

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

     

    package com.wepull.singleton;

     

    /**

     * @author leno 饿汉式单例类

     */

    public class EagerSingletion {

       private static EagerSingletion single = new EagerSingletion();

     

       private EagerSingletion() {

       }

     

       public static EagerSingletion getnSingInstance() {

          return single;

       }

    }

    package com.wepull.singleton;

     

    /**

     * @author leno 懒汉式单例类

     */

    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 leno 单子模式类

     */

    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 leno 测试类

     */

    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();

       }

     

    }

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

  • 相关阅读:
    golang_并发安全: slice和map并发不安全及解决方法
    什么情况下需要用到互斥锁sync.Mutex?
    使用Charles进行HTTPS抓包
    centos6 yum 源失效 404,终于解决了
    GOMAXPROCS你设置对了吗?
    容器资源可见性问题与 GOMAXPROCS 配置
    gflags 使用方式
    分布式训练问题
    NCCL常用环境变量
    git 常用命令
  • 原文地址:https://www.cnblogs.com/CharmingDang/p/9663859.html
Copyright © 2020-2023  润新知