• 设计模式学习笔记(十四:单件模式)


    1.1概述

        保证一个类仅有一个实例,并提供一个访问它的全局访问点。这就是单件模式的定义。

        在某些情况下,我们可能需要某个类只能创建一个对象,即不让用户用该类实例化出多于两个的实例。

      例如,在一个公文管理系统中,公文类的实例“公文文件”,需要将公章类的实例作为自己的一个成员,以表明自己是一个有效的公文文件,那么系统的设计者就需要保证公章类只有一个实例,不能允许用户使用公章类的构造方法再创建出第2个实例。

      单件模式是关于怎样设计一个类,并使该类只有一个实例的成熟模式,该模式的关键是将类的构造方法设置为private权限,并提供一个返回它的唯一实例的类方法(static)。

    1.2模式的结构

    单件模式的结构非常简单,只有一种角色:

    (1)单件类(Singleton):单件类只可以创建出一个实例。

     单件模式结构类图如下所示:

    单件类的设计有如下特点:

    (1)单件类中包含有自身声明的类变量,这个类变量就是单件类唯一的实例。

    (2)单件类的构造方法访问权限是private。为了确保单件类中自身声明的类变量是单件类唯一的实例,单件类必须将构造方法的访问权限设置为private。这样一来其他类都无法使用单件类创建的对象。

    (3)单件类负责创建自己唯一的实例,并提供访问该实例的类方法。由于单件类的构造方法被设置为private,所以单件类必须自己负责创建自身声明的实例。为了让用户使用单件类这个唯一实例,单件类必须提供一个类方法,以便其他用户使用单件类的类名就可以调用这个类方法访问使用单件类这个唯一实例。

     

    1.3单件模式的优点

    1)单件类的唯一实例由单件类本身控制,所以可以很好地控制用户何时访问它。

    1.4适合使用单件模式的情景

    1)当系统需要某个类只能有一个实例

    1.5单件模式的使用

      以下通过一个简单的问题来描述怎样使用单件模式,这个问题就是创建唯一的月亮。单件模式的类图是所有模式中最简练的,只涉及一个角色:单件类。

    1)对于这个简单的问题,设计的单件类是Moon,代码如下:

    package com.liuzhen.fourteen_prototype;
    
    public class Moon {
        private static Moon uniqueMoon;
        double radius;
        double distanceToEarth;
        
        private Moon(){
            uniqueMoon = this;
            radius = 1738;
            distanceToEarth = 363300;
        }
        
        public static synchronized Moon getMoon(){   //这是一个同步方法
            if(uniqueMoon == null){
                uniqueMoon = new Moon();
            }
            return uniqueMoon;
        }
        
        public String show(){
            String s = "月亮的半径是:"+radius+"km,距离地球的距离是:"+distanceToEarth+"km";
            return s;
        }
    }

    (2)模式的具体使用

     通过FourteenApplication类来具体实现上述相关类和接口,来实现单件模式的运用,其代码如下:

    package com.liuzhen.fourteen_prototype;
    
    public class FourteenApplication {
        
        public static void main(String[] args){
            MyFrame f1 = new MyFrame("张三看月亮");
            MyFrame f2 = new MyFrame("李四看月亮");
            f1.setBounds(10, 20, 360, 200);
            f2.setBounds(370, 20, 360, 200);
            f1.validate();
            f2.validate();
        }
    }

    MyFrame.java代码如下:

    package com.liuzhen.fourteen_prototype;
    
    import java.awt.Font;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    
    @SuppressWarnings("serial")
    public class MyFrame extends JFrame{
        String str;
        MyFrame(String title){
            setTitle(title);
            Moon moon = Moon.getMoon();
            str = moon.show();
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            setVisible(true);
            repaint();
        }
        
        public void paint(Graphics g){
            super.paint(g);
            g.setFont(new Font("宋体",Font.BOLD,14));
            g.drawString(str, 5, 100);
        }
    }

    运行结果如下:

    参考资料:

          1.Java设计模式/耿祥义,张跃平著.——北京:清华大学出版社,2009.5

  • 相关阅读:
    【足迹C++primer】32、定制操作_2
    pom文件miss artifact com.sun:tools:jar:1.5.0:system问题
    cents上运行wget报错:unable to resolve host address
    怎样定义函数模板
    06006_redis数据存储类型——String
    雷林鹏分享:C# 类型转换
    雷林鹏分享:C# 运算符
    雷林鹏分享:C# 循环
    雷林鹏分享:C# 判断
    雷林鹏分享:C# 方法
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6032875.html
Copyright © 2020-2023  润新知