设计模式1#单例

来源:互联网 发布:东快傻 知乎 编辑:程序博客网 时间:2024/06/05 11:15

单例

解决:保证了一个类在内存中只能有一个对象。

思路:1、如果其他程序能够随意用new创建该类对象,那么就无法控制个数。因此,不让其他程序用new创建该类的对象。
2、既然不让其他程序new该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了。

3、该类将创建的对象对外(整个系统)提供,让其他程序获取并使用。

步骤

1、将该类中的构造函数私有化。
2、在本类中创建一个本类对象。
3、定义一个方法,返回值类型是本类类型。让其他程序通过该方法就可以获取到该类对象。

单例有两种:

1饿汉式:

class Single{private static final Single s = new Single();private Single(){            }public static Single getInstance(){    return s;}}
2懒汉式:

class Single2 {private static Single2 s = null;private Single2(){            }public static synchronized Single2 getInstance() {//为了保证线程安全,加锁if(s==null)s=new Single2();return s;}}
这里我给出两个例子来立理解如何使用单例的饿汉式和懒汉式:

饿汉式演示代码:

Single类:

package cn.hncu.pattern.singleton.one;/** * @author 军街 *饿汉式 */public class Single {private static final Single s=new Single();private Single(){}public static Single getInstance(){return s;}}
mian类:

package cn.hncu.pattern.singleton.one;public class TestSingle {public static void main(String[] args) {Single s1=Single.getInstance();Single s2=Single.getInstance();System.out.println(s1==s2);}}
懒汉式演示代码:

Single类:

package cn.hncu.pattern.singleton.two;/** * @author 军街 *懒汉式 */public class Single {private static Single s=null;private Single(){}public static synchronized Single getInstance(){if(s==null){s=new Single();}return s;}}

main类:

package cn.hncu.pattern.singleton.two;/* * 这里要注意的是,懒汉式如果多线程下有概率第一次被同时访问,就会可能new多个。所以要加锁防护。 * */public class TestSingle extends Thread{public static void main(String[] args) {TestSingle ts[]=new TestSingle[50]; for (int i = 0; i < ts.length; i++) {ts[i]=new TestSingle();}for (int i = 0; i <ts.length; i++) {ts[i].start();}}@Overridepublic void run() {Single s=Single.getInstance();System.out.println(s);}}

通过这两个例子我们明显可以看出我们控制了每次new的对象只有第一个是真正的new出来的,其他的和第一个内存地址相等。如下图所示:






0 0