运行过程中只有一个对象,可防止一个或多个类调用时,产生多个对象,发生错误。
有些对象我们只需要一个:线程池、缓存、硬件设备等
如果多个实例会有造成冲突、结果的不一致性等问题
最典型的例子:打印机打印东西,在学校打印的时候,几台打印机一起工作,如果不使用单例模式,打出来的纸张就会混在一起,这是我实际生活中碰到的问题
用静态变量方式来实现
程序员之间协商个全局变量
这两个都是实际使用中单例的思想
单例模式:确保一个类最多只有一个实例,并提供一个全局访问点
package com.java.jikexueyuan.singleton;
public class Singleton {
private static Singleton uniqeInstance=null;
//这个构造对象是私有的,杜绝了外面构造这个对象的可能
private Singleton(){
};
//只能调用这个类里面自己写的这个构造函数来构造
public static Singleton getInstance()
{
//第一次调用时,判断uniqeInstance是否为空,为空就new一个新的,不为空直接返回,保证了始终只有一份实例对象
if(uniqeInstance==null)
{
uniqeInstance=new Singleton();
}
return uniqeInstance;
}
}
案例一:巧克力工厂
package com.java.jikexueyuan.singleton;
public class ChocolateFactory {
private boolean empty;
private boolean boiled;
//双重检查加锁
public volatile static ChocolateFactory uniqueInstance = null;
//私有构造函数
private ChocolateFactory() {
empty = true;
boiled = false;
}
public static ChocolateFactory getInstance() {
if (uniqueInstance == null) {
//考虑多线程的情况
//这里使用了线程锁,保证第一个线程完成了,才能执行
synchronized (ChocolateFactory.class) {
if (uniqueInstance == null) {
uniqueInstance = new ChocolateFactory();
}
}
}
return uniqueInstance;
}
public void fill() {
if (empty) {
// 添加原料巧克力动作
empty = false;
boiled = false;
}
}
public void drain() {
if ((!empty) && boiled) {
// 排出巧克力动作
empty = true;
}
}
public void boil() {
if ((!empty) && (!boiled)) {
// 煮沸
boiled = true;
}
}
}