转自:《Java 设计模式》2009年( 耿祥义 张跃平 著)
一,概括
单例模式:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
二,引入
在某些情况下,我们可能需要某个类只能创建出一个对象,即不让用户用该类实例化出多于两个的实例。比如,苏轼说的 “但愿人长久,千里共婵娟”,或是张若虚说的 “海上升明月,天涯共此时”。无论我们身处何方,我们所能够看到的月亮都是同一轮的啊。在根据这两句诗创建的系统中,有人这个类,他们有名字和位置的属性,他们也可以实现赏月的动作,但是他们赏的是同一个月,那么设计者就需要保证只有一个月亮的实例,不能允许用户使用月亮的构造方法再创建出第2个实例。
三,代码与类图
上面引入的代码:
class Moon { private static Moon m; private double radius; // 构造方法 private Moon() { m = this; radius = 1738; } // 存取方法 public static synchronized Moon getMoon() { if(m == null) m = new Moon(); return m; } // 功能方法 public String showMoon() { String s = "这是独一无二的月亮,它的半径是" + radius + " km."; return s; } } class Someone { private String name; private String where; // 构造方法 public Someone(String name,String where) { this.name = name; this.where = where; } // 功能方法 public void seeMoon() { Moon m = Moon.getMoon(); System.out.printf("有个叫" + this.name + "的人正在" + where + "赏月。" + m.showMoon() + "\n"); } } public class M { public static void main(String args[]) { Someone SuShi = new Someone("苏轼","酒桌前"); Someone ZhangJiuling = new Someone("张九龄","空房中"); SuShi.seeMoon(); ZhangJiuling.seeMoon(); } }
上面引入的类图:
(注: 由于找不到合适的箭头,这箭头就画的不标准了)
四,单例模式的结构
单例模式的结构十分简单,只包括一个角色:单例类(Singleton),单例类只可以创建出一个实例。
单例类在设计上的特点:
①:单例类中包含用自身声明的类属性,这个类属性是单例类唯一的实例。
②: 为了确保用自身声明的类属性只有一个实例,单例类将自身的构造方法的访问权限设置为 private .这样一来,任何其他类都无法使用单例类来创建对象。
③:为了让用户使用单例类的唯一实例,单例类必须提供访问该实例的方法,使得用户可以使用单例类的类名调用这个类方法访问这个唯一的实例。
五,单例模式的优缺点
优点:单例类的唯一实例由类本身控制,所以可以很好地控制用户何时访问它。
六,单例模式的使用场景
当系统需要某个类只能有一个实例。
=========== ========== ======= ====== ====== ===== ==== === == =
青玉案·元夕 宋代: 辛弃疾
东风夜放花千树,更吹落,星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。蛾儿雪柳黄金缕,笑语盈盈暗香去。众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。
,