目标
今天我们还是“赌博”的一天,今天我们首先学习了深入单例设计模式,然后就进入了敲代码的一天,这个Demo包含的只是非常多,可以说把我会的都用上了,我不会的也运用了不少,加深了我们对已经学习的知识的串联度。
学习的知识
什么是单例设计模式?
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
具体实现
需要:
1.将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
2.在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。
3.定义一个静态方法返回这个唯一对象。
实现一:立即加载 / “饿汉模式”
立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化。
class Pokers{
//1.默认构造函数
//2.定义一个静态的成员变量 记录这个单例对象
//饿汉式
//default sharedInstance manager
public static final Pokers shared=new Pokers();
private Pokers(){
}
public void test(){}
}
“饿汉模式”的优缺点:
优点:实现起来简单,没有多线程同步问题。
缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
实现二:延迟加载 / “懒汉模式”
延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。
class Player{
public int count;
//2.创建静态变量
private static Player shared=null;
//1.构造方法私有化
private Player(){
}
//3.提供给外部一个访问的方法
public static Player getInstance(){
Object b =new Object();
synchronized ((b)){
if(shared==null){
shared=new Player();
}
}
return shared;
}
}
“懒汉模式”的优缺点:
优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存。
缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。
我们在所写的demo里面采用的是恶汉模式,为了避免使用懒汉模式是有可能发生的不不必要的错误
敲代码的感悟
在我们所写的Dome里面我印象最深的就是类里面方法的使用,我们所写的方法很多但是都是我都能看懂的方法,但是在这样一个目前来说我们接触过的最大的dome,里面一个方法不仅仅只是一个方法,还有方法之间的互相使用,还有一个对象对一个属性的引用,或许正是因为这种原因,使我在阅读代码的时候常常会有一些疑惑,阅读起来就像是剥茧抽丝一样,我也就感受到了这个代码的难度。但是我想这应该是一道我应该克服的障碍。想来也是自己的逻辑性有点差。由于自己还没有完全搞懂所以就不上代码了。