zoukankan      html  css  js  c++  java
  • 设计模式学习--单例模式

    概念

    创建单一实例,保证类在程序中只有一个实例。

    需要做到

    • 构造方法私有 (+ private修饰符)
    • 在类中创建对象(为了类的内部调用需要+static修饰;为了防止外部通过类名调用需要+private)
    • 给外部提供公共的访问方法(为了外界能获取到此方法,需要+static修饰)

    饿汉式单例模式

    一句话:类加载的时候对象已经创建好了

    public class Student {
    	private Student() {}
    	private static Student student = new Student();
    	public static Student getStudent(){
    		return student;
    	}
    	public void say(){
    		System.out.println("我叫A学生");
    	}
    }
    

    懒汉式单例模式

    一句话:什么时候要对象,就什么时候创建对象

    public class Student {
    	private Student() {}
    	private static Student student=null;
    	public synchronized static Student getStudent(){
    		if(student == null){
    			student = new Student();
    		}
    		return student;
    	}
    	public void say(){
    		System.out.println("我叫A学生");
    	}
    }
    

    推荐使用的是饿汉式单例模式

    分析:
    • 懒汉式单例模式的问题:
    1. 线程安全问题怎么产生的?(多线程访问getStudent时可能某个进程获取到的对象为null)
    2. 线程安全问题怎么解决的?(+关键字synchronized)
    

    案例

    学生类
    package design03;
    
    /**
     * 这是一个学生类
     * @author wangtengfei-ds
     *
     */
    public class Student {
    	/**
    	 * 私有化构造方法,不允许外界创建此类的对象
    	 */
    	private Student() {
    		
    	}
    	
    	/**
    	 * 在类的内部创建类的对象
    	 */
    	private static Student student = new Student();
    	
    	/**
    	 * 为外界提供获取类的对象的方法
    	 * @return student对象
    	 */
    	public static Student getStudent(){
    		return student;
    	}
    	
    	/**
    	 * 提供一个对象的方法案例
    	 */
    	public void say(){
    		System.out.println("我叫A学生");
    	}
    }
    
    
    测试学生类
    package design03;
    
    /**
     * 单例模式测试小程序
     * @author wangtengfei-ds
     *
     */
    public class StudentTest {
    	public static void main(String[] args) {
    		Student s1 = Student.getStudent();
    		Student s2 = Student.getStudent();
    		System.out.println(s1==s2);//true
    		s1.say();
    		s2.say();
    	}
    }
    
  • 相关阅读:
    Appium的三种启动方式(转载)
    select单选框和多选框设置默认值
    JavaScript获取到ModelAndView的对象
    Selenium+PageObject+Java实现测试用例
    2017ACM-ICPC 青岛 K.Our Journey of Xian Ends
    Django简单数据库交互演示
    简单树刨+线段树模板 877E
    ACM 二维离散化模板 hdu5925
    code::blocks配置头文件#include<bits/stdc++.h>
    百度之星初赛b
  • 原文地址:https://www.cnblogs.com/wtf0215-golang/p/5867924.html
Copyright © 2011-2022 走看看