设计模式:所谓模式即解决某一类问题最行之有效的解决方案,在JAVA中有23种设计模式,分别为:
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、模式、访问者模式。
单例设计模式:保证一个类的实例可以有且只可以有一个,
即保证一个类在内存中只存在一个对象,避免其他程序过多建立对象
解决思路:
1.先禁止其他程序建立该类对象
2.在本类中自定义一个对象
3.对外提供访问方式
代码实现:
1.将构造函数私有化
2.在类中创建一个本类对象
3.提供一个方法可以获取该对象,
注:既然不能在其他类创建该类的对象,所以只能在本类中创建本类对象,
即对于对外提供获取该对象的方法调用两种途径:1.对象;2.类名;只能选择用类名调用,
所以该方法应为static修饰,同理静态方法访问的类内部成员也应为静态。
class Single
{
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
class SingleDemo
{
public static void main(String[] args)
{
Single s = Single.getInstance();
}
}
---------------------------------------------------------
----------------------------------------------------------
用以下测试程序验证:
class Single
{
private int num;
public void setNum(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
private Single(){}
private static Single s = new Single();//先初始化对象,称为饿汉式
public static Single getInstance()
{
return s;
}
}
class SingleDemo
{
public static void main(String[] args)
{
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
s1.setNum(23);
System.out.print(s2.getNum());
}
}
输出结果为:23,即由于使用单例模式,所以s1和s2指向同一个堆内存中的对象。这种设计单例模式在Single类一进内存,就在堆内存中创建对象,所以称之为饿汉式
单例另一种形式:
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s == null)
s = new Single();
return s;
}
}
这种单例设计模式在getInstance()方法被调用才进行对象初始化,即对象延时加载,所以称之为懒汉式
懒汉式在多线程中存在的安全问题,即当A程序执行完 if(s
== null) 判断后,切换到另一个线程,则调用该方法的B程序此时将创建一个Single对象,
当A程序再次获得CPU的执行权时,不再进行if(s == null) 判断就直接创建该类对象!!
单例模式的第三种形式:
<pre name="code" class="java">class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s == null)
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
return s;
}
}
双重锁形式,加了synchronized关键字,即解决了多线程情况下的安全问题,又由于采用双重判断方式避免了直接将synchronized加在方法名上所导致的低效问题,即public static synchronized Single getInstance()。
小结:实际开发一般用饿汉式,虽然类一加载就创建对象,但是单例模式的设计就是为了保证对象的唯一性,
也就是说就是需要用到这个类的实例对象。