欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

设计模式之单例模式

程序员文章站 2022-06-28 17:51:12
1.单例(Singleton)模式的定义一个类只有一个实例,且该类能自行创建这个实例的一种模式2.单例模式特点单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点。3.单例模式的优缺点优点:单例模式可以保证内存里只有一个实例,减少了内存的开销。可以避免对资源的多重占用。单例模式设置全局访问点,可以优化和共享资源的访问。缺点:单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径......

1.单例(Singleton)模式的定义

一个类只有一个实例,且该类能自行创建这个实例的一种模式


 2.单例模式特点 

  • 单例类只有一个实例对象;
  • 该单例对象必须由单例类自行创建;
  • 单例类对外提供一个访问该单例的全局访问点。

3.单例模式的优缺点

优点: 

  1. 单例模式可以保证内存里只有一个实例,减少了内存的开销。
  2. 可以避免对资源的多重占用。
  3. 单例模式设置全局访问点,可以优化和共享资源的访问。

缺点:

  1. 单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
  2. 在并发测试中,单例模式不利于代码调试。在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象。
  3. 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。

4.懒汉单例模式应用 

package singleton;
/**
 * 懒汉单例模式:类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例
 * @author Admin
 *
 */
public class LazySingleton {
	//保证 instance 在所有线程中同步
//	volatile关键字修饰的共享变量主要有两个特点:1.保证了不同线程访问的内存可见性    2.禁止重排序
	 private static volatile LazySingleton instance=null;   
	  //private 避免类在外部被实例化
	    private LazySingleton(){}  
	    public static synchronized LazySingleton getInstance() {
	        //getInstance 方法前加同步
	        if(instance==null){
	            instance=new LazySingleton();
	        }
	        return instance;
	    }
}
package singleton;
/**
 * 懒汉式单例模式案例
 * @author Admin
 *
 */
public class LazySingletonDemo {

	public static void main(String[] args) {
//		调用getInstance方法
		Country country1=Country.getInstance();
		Country country2=Country.getInstance();
//		判断对象是否相同
		if(country1==country2) {
			System.out.println("是同一个对象");
		}else {
			System.out.println("不是同一对象");
		}
	}
}

//国家类
class Country{
	//保证instance在所有线程中同步
    private static volatile  Country instance=null;    
    //private避免类在外部被实例化
    private  Country() {
        System.out.println("出现一个国家!");
    }
    public static synchronized  Country getInstance(){
        //在getInstance方法上加同步
        if(instance==null) {
               instance=new  Country();
        }else {
           System.out.println("已经有一个国家,不能产生新国家!");
        }
        return instance;
    }
    
   
}


5.饿汉单例模式应用

package singleton;
/**
 * 饿汉单例模式:类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了
 * @author Admin
 *
 */
public class HungrySingleton {
 
	 private static final HungrySingleton instance=new HungrySingleton();
	 
	    private HungrySingleton(){
	    }
	    
	    public static HungrySingleton getInstance(){
	        return instance;
	    }
}
package singleton;
/**
 * 饿汉单例模式例子
 * @author Admin
 *
 */
public class HungrySingletonDemo {

	public static void main(String[] args) {
		Person p1=Person.getInstance();
		Person p2=Person.getInstance();
		if(p1==p2) {
			System.out.println("同一个人");
		}else {
			System.out.println("不是同一个人");
		}
	}
}

//人类
class Person{
	private static Person instance=new Person();
    private Person() { 
    	System.out.println("出现一个人");
      }
    public static Person getInstance() {
        return instance;
    }
}

 

本文地址:https://blog.csdn.net/weixin_44364444/article/details/109581790

相关标签: java