虽然进度很慢,但如果能把自己学的每个东西都吃透也算是值得了。加油,加油,加油!
设计模式:解决某一类问题,最行之有效的方法,java中有23中设计模式。
单例设计模式:解决一个类在内存中只存在一个对象的问题。
想要保证对象唯一:1)为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象
2)还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象
3)为了方便其他程序对自定义对象的访问,可以提供一些访问方式。
代码体现:
1)将所有构造函数私有化,这样可禁止其他程序建立对象
2)在类中创建本来对象
3)提供一个可以获取该对象的方法,又因为该类不能创建对象,要访问类中方法只能采用“类名.方法名”的方式,因此此时方法要设成静态的。又因为静态方法中不能引用非静态变量,所以上面创建对象时也要设成静态的。
class Student
{
private Student(){} // 构造函数私有化
private static Student st = new Student(); // 创建private属性的对象
<span style="white-space:pre"> </span>//可以获取对象的静态方法
public static Student getInstance()
{
return st;
}
private int age;
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
class SingleDemo
{
public static void main(String[] args)
{
//实验确定ss和ss2是指向同一个对象的
Student ss = Student.getInstance();
Student ss2 = Student.getInstance();
ss.setAge(35);
System.out.println(ss2.getAge());
}
}
注意:单利设计模式存在饱汉式和饿汉式两种方式,上面介绍的是饿汉式,也是平时最常用的一种方式。饱汉式的设计方式是:
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null){
<span style="white-space:pre"> </span>synchronized(Single.class)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(s==null){
<span style="white-space:pre"> </span>s = new Single():
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>}
<span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;">}</span>
<span style="white-space:pre"> </span>}
return s;
}
}
这里多了一个对对象是否创建的判断,代码稍显复杂。所以最常用的还是饿汉式。
之前用到过多线程就一直没搞懂这个异步操作,今天算是有一些明白了,简要介绍下synchronized。这其实就是一个锁,被他修饰的代码块只能同时被一个程序访问。即,每个程序执行到synchronized(Single.class)关键字时会先判断,下面是否有程序正在执行代码块内内容,如果有则后面的程序不能进入执行,只能等上一个执行完了才可以进入执行。