JAVA设计模式学习笔记-单例模式

运行过程中只有一个对象,可防止一个或多个类调用时,产生多个对象,发生错误。
有些对象我们只需要一个:线程池、缓存、硬件设备等
如果多个实例会有造成冲突、结果的不一致性等问题

最典型的例子:打印机打印东西,在学校打印的时候,几台打印机一起工作,如果不使用单例模式,打出来的纸张就会混在一起,这是我实际生活中碰到的问题

用静态变量方式来实现
程序员之间协商个全局变量

这两个都是实际使用中单例的思想

单例模式:确保一个类最多只有一个实例,并提供一个全局访问点

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;
		}
	}
}

posted @ 2020-02-01 20:38  KrisTse  阅读(136)  评论(0编辑  收藏  举报