zoukankan      html  css  js  c++  java
  • 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;
    		}
    	}
    }
    
    
  • 相关阅读:
    c++和java(c#)之间的pk
    C语言中.h和.c文件解析
    怎样花两年时间去面试一个人
    进程调度算法模拟
    1079 中国剩余定理
    Educational Codeforces Round 50 (ABCD)
    解决Android Studio默认AppTheme 没有lable标签,不显示等问题
    Codeforces Round #508(ABCD)
    牛客OI赛制测试赛2
    deepin关机卡在图标界面 mysql Community...10min
  • 原文地址:https://www.cnblogs.com/kristse/p/singletonpattern.html
Copyright © 2011-2022 走看看