第一个设计模式:
设计模式听着挺牛X的,其实就是编程中的一种常用结构,当遇到某种特定问题的时候,这些设计模式能更好地实现功能。要是不用设计模式能把代码写出来也可以,只是这些经过众牛人研究过,也经过时间考验过的编写方式应该更有效率,更具安全性。下面是一个相对简单的设计模式:单例模式。
什么是单例模式:一个类在内存中只有一个对象(也就是只有一个实例)。
目的:
1、 避免其他方法再次建立该类的对象,先控制禁止其他方法建立该类对象。
2、 其他方法需要访问到该类对象,因此要在本类中自定义一个对象。
3、 方便其他方法对自定义对象的访问,需要提供一些访问方法。
代码实现:
1、 将构造函数私有化(防止其他方法再次建立对象)
2、 在类中创建一个本类对象(其他方法不能建立对象,只能在类中自己建立一个)
3、 提供一个方法可以获取该类对象(其他方法不能建立对象,可以让它们获取类自己创建的在这个对象)
饿汉式://一般使用这个,安全性高
class Single {
private String name;
private Single(){} //私有,防止其他方法创建新对象
private static Single s = new Single();
public static Single getInstance(){
return s;
}
public static void main(String[] args) {
Single s = Single.getInstance();
System.out.println(s.name); //刚创建完对象s,其name为null
s.name= "lisi";//为这个对象中的name赋值
System.out.println(s.name);
Single s2 = Single.getInstance();//另外s2也要访问这个对象
System.out.println(s2.name);//输出的是lisi,因为就一个对象
}
}
懒汉式://面试中经常考这里,但现实工作中不常用
class Single1 {
private Stringname;
private Single1(){}
//在Single1s = Single1.getInstance();语句中,
//Single1 s 时先不生成对象,
//等到调用到single1里面的getInstance方法时,才创建对象。称之为懒汉式
private static Single1 s = null;
public static Single1getInstance(){
if (s==null)
{
s = new Single1();
}
return s;
}
public static void main(String[] args) {
Single1 s = Single1.getInstance();
System.out.println(s.name);
s.name= "lisi";
System.out.println(s.name);
Single1 s2 = Single1.getInstance();
System.out.println(s2.name);
}
}
但是这里有一个问题:
public static Single1 getInstance(){
if (s==null)
{
s = new Single1();
}
return s;
}
当A方法执行到 if(s==null)时,由于没有对象创建,所以可以进入到s= new Single1()这一句之前,准备创建对象,如果这个时候cpu停下来去执行其他东西,有可能会有另外一个B方法执行到if语句,因为此时没有对象,所以也可以到 s = new Single1(),去创建另外一个对象,这样就不能保证只有一个对象创建。
解决方法:
加入多线程中的同步synchronized,使得只有一个方法能进入到getInstance方法中去创建对象。
代码如下:
public static synchronized Single1 getInstance(){
if (s==null)
{
s = new Single1();
}
return s;
}
但是因为每次执行到这里都会判断是否有方法在getInstance之内,而synchronized的效率很低,因此又有了双重判断来提高效率:
public static Single1 getInstance(){
if (s==null)
{
synchronized(Single1.class)
{
if (s==null)
s = new Single1();
}
}
return s;
}