单例模式的饿汉式与懒汉式(基础)

单例模式主要为饿汉式与懒汉式,那么为什么要需要这个东西?
我自己对它的理解是,有些事只需要一个,就像老婆只要一个就够了(可能有些兄弟不这么想)。
多了的话就浪费资源,老婆多了也容易出问题。所以需要的单例模式来管控,就像法律管控的一夫一妻制。
也比如一些游戏,它规定只能有一个炮台,程序创造出一个炮台之后就不允许再创建了,不然玩家难度就太小了。
只能创建一个对象,类外部的世界那么纷繁复杂,如何才能保证?
如果类外部可以创建一个对象,那它为什么不可以创建第二个?所以事情还得做绝,那就是-------剥夺类外部创造对象的权力。
创建对象需要用啥?构造器!对,就在构造器身上下刀。
也就是要动用权限修饰符private,将构造器设置为私有的。那么外部就无法访问构造器了,自然就无法创建对象了。

class Bank{
    
    
	private Bank(){
    
    
  }
}

类外部不能插手了,类内部就可以自己创建对象了。

class Bank{
    
    
	private Bank(){
    
    
	}
	private static instance=new Bank();
}

私有化对象后,需要获取对象的话就只能通过方法来获得,就像封装里的getter()方法一样
而在单例模式里,获得对象的方法一致叫做getInstance()
因为外界无法创建对象,自然也就无法通过new对象来调用方法。
这个时候,静态static的作用就大大地发挥了出来,因为静态的方法也好,属性也好,都可以直接用类来调用,无需创建对象。

class Bank{
    
    
	private Bank(){
    
    }
	private static instance=new Bank();
	public static Bank getInstance(){
    
    
		return instance;
	}
}

接下来就是饿汉式的整体代码

public  class  SingletonTest1{
    
    
    Bank  bank=Bank.getInstance();
}                  
//饿汉式
class  Bank{
    
     
     //1.私有化类的构造器
private  Bank(){
    
    
}
//2.内部创建类的对象
//4.要求此对象也必须声明为静态的
private  static  Bank  instance=new  Bank();
//3.提供公共的静态的方法,返回类的对象
public   static  Bank  getInstance(){
    
    
     return  instance;
}
}

那么这里有个问题,为什么要把对象也设置为private
这里我问了老师,并且把我认为可行的代码发给老师看了,如下:

public class Test3 {
    
    
    public static void main(String[] args) {
    
    
      Bank bank=Bank.instance;
    }
}
class Bank{
    
    
    private Bank(){
    
    

    }
     static Bank instance=new Bank();
}

老师让我测试一下产生两个实例,代码如下:

public class Test3 {
    
    
    public static void main(String[] args) {
    
    
      Bank bank1=Bank.instance;
      Bank bank2=Bank.instance;
        System.out.println(bank1==bank2);
    }
}
class Bank{
    
    
    private Bank(){
    
    

    }
     static Bank instance=new Bank();
}

结果为true
老师给我的解释是:默认规则你可以不执行,不会出错。私有化成员变量的目的是方便给成员变量赋值时做一些验证,如判断是不是符合某种规则,如上课时说的age>0
这是个小插曲。
懒汉式

//懒汉式(目前的写法线程不安全)
class  Order{
    
    
private  Order(){
    
    
}
private  Order  instance=null;
public   static  Order  getInstance(){
    
    
      if(instance==null){
    
    
     instance=new  Order();
}
        return  instance;
}
}

懒得解释了,下次勤快了再写一篇懒汉式吧…orz

猜你喜欢

转载自blog.csdn.net/heipao17/article/details/120673149