单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说,只有一个实例是很重要的,虽然系统中可以有许多打印机,但却只应该有一个打印机假脱机,只应该有一个文件系统和一个窗口管理器,一个数字滤波器只能有一个A/D转换器,一个会计系统只能专用于一个公司。怎样才能保证一个类只有一个实例并且这个实例易于被访问,一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象,一个更好的方法是让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法,这就是Singleton模式。

实用性:在下面的情况下可以使用Singleton模式:

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

import javax.swing.*;

import java.awt.*;

public class TestSingleton

{

    public static void main(String args[])

    {

        System.out.println(“System Print Out”);

       int x1=40;

       int y1=40;

       int x2=100;

       int y2=100;

       Color paint_color = Color.blue;

       Video2.getInstance(x1,y1,x2,y2,paint_color);

       for(int i=0;i<3;i++)

       {

           paint_color = Color.red;

           Video2.getInstance(x1+40,y1+40,x2,y2,paint_color);

       }

       System.out.println(“System Print Out”);

    }

}

class Video2 extends JFrame

{

    static int x1;

    static int y1;

    static int x2;

    static int y2;

    static Color paint_color;

    //定义Construct函数,将需要的参数带入

    public Video2(int x1,int y1,int x2,int y2, Color paint_color)

    {

       Video2.x1=x1;

       Video2.y1=y1;

       Video2.x2=x2;

       Video2.y2=y2;

       Video2.paint_color = paint_color;

       setBounds(200,100,200,500);

       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       setVisible(true);

    }

    int j=0;

    //@Override

    public void paint(Graphics g)

    {

       System.out.println(++j);

       g.setColor(paint_color);

       g.drawLine(x1, y1, x2, y2);

    }

    public static synchronized Video2 getInstance(int x1,int y1,int x2,int y2,Color paint_color){

        if (instance == null) {

          instance = new Video2(x1, y1, x2, y2, paint_color);

        }

        instance.repaint();

        return instance;

      }

    private static Video2 instance;

}