23个java设计模式(十四)-- 单例模式

2016年03月22日 原创
关键词: java 设计模式
摘要 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

一、概述。

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

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

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

二、单例模式的结构。

单例模式的结构非常简单,只包括一种角色

  • 单例类(Singleton),单例类只可以创建出一个实例。

三、示例程序。

单例类(Singleton)

Moon.java

public class Moon {
	private static Moon uniqueMoon;
	private double radius;
	private 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;
	}

}

测试程序

MyFrame.java

public class MyFrame extends JFrame{
	private String str;
	public MyFrame(String title) {
		setTitle(title);
		Moon moon = Moon.getMoon();
		str = moon.show();
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
		repaint();
	}
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.setFont(new Font("宋体",Font.BOLD,15));
		g.drawString(str, 5, 100);
	}
	
}

Example1Test.java

public class Example1Test {
	public static void main(String[] args) {
		MyFrame f1 = new MyFrame("张三看月亮");
		MyFrame f2 = new MyFrame("李四看月亮");
		f1.setBounds(10, 10, 360, 150);
		f2.setBounds(370,10,360,150);
		f1.validate();//绘制窗口
		f2.validate();
	}
}

四、单例模式的优点。

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

五、适合单例模式的情景。

系统需要某个类只能有一个实例。