黑马程序员技术交流社区

标题: 今天学习了 单例模式 分享一下代码 [打印本页]

作者: zs1973    时间: 2015-6-11 23:55
标题: 今天学习了 单例模式 分享一下代码
大家可以copy代码运行一下。这样更直观一些,虽然这些东西很粗浅,但是敲一下会加深印象自己敲最好



设计模式:单例
单例模式有:饿汉式,懒汉式,登记式。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例的特点:
一:单例类只能有一个实例。
二:单例类必须自己自己创建自己的唯一实例。
三:单例类必须给所有其他对象提供这一实例。

下面来看一下不使用单例面模式的类:

package itheiomatest;

public class Main {

    public static void main(String[] args) {
        //new 两个notSingle类的实例,并给里面的属性a赋值

        NotSingle ns=new NotSingle();
        NotSingle ns1=new NotSingle();
        ns.setA(2);
        ns.show();
        ns1.show();
    }

}

class NotSingle{
    public NotSingle(){

    }
    private int a;
    public void setA(int a ){
        this.a=a;
    }
    public void show(){
        System.out.println(this.a);
    }
}

从上面的代码可以看出,我们实例化出两个NotSingle类的对象以后,ns和ns1都有自己指向的地址,也就是他们的地址不指向同一个对象。所以当给ns里面的a属性赋值后并不会影响ns1对象里面属性 a的值。

下面使用单例模式来创建一个类:
饿汉式:
创建步骤:
1.私有化构造函数。
2.在类中创建一个本类对象。
3.提供一个方法可以获得该对象。

package itheiomatest;

public class Main {

    public static void main(String[] args) {
        //new 两个notSingle类的实例,并给里面的属性a赋值

        Single s=Single.getInstance();
        s.setA(3);
        s.Show();
        Single s1=Single.getInstance();
        s1.Show();
    }

}

class Single{
    //私有化构造方法
    private Single(){

    }
    //创建一个私有的本类对象
    private static Single s=new Single();
    //提供一个公共的方法获得该类的实例
    public static Single getInstance(){
        return s;
    }

    private int a;
    public void setA(int a ){
        this.a=a;
    }
    public void Show(){
        System.out.println(this.a);
    }
}

我们在上面的main函数的代码中通过Single.getInstance()得到了两个Single类的实例s1,s2,我们只给s实例里面的a属性赋值为3,s1实例里面的属性a并没有赋值,但是当我们调用s和s1的Show()方法时,输出的都是a为3。这是因为s和s1实例的指向地址相同。都指向Single类里面的s。

懒汉式:

package itheiomatest;

public class Main {

    public static void main(String[] args) {
        //new 两个notSingle类的实例,并给里面的属性a赋值

        Single s=Single.getInstance();
        s.setA(3);
        s.Show();
        Single s1=Single.getInstance();
        s1.Show();
    }

}

class Single{
    //私有化构造方法
    private Single(){

    }
    //创建一个私有的本类对象
    private static Single s=null;
    //提供一个公共的方法获得该类的实例
    public static Single getInstance(){
        if(s==null){

            synchronized(Single.class){
                if(s==null){
                    s=new Single();
                }
            }

        }
        return s;
    }

    private int a;
    public void setA(int a ){
        this.a=a;
    }
    public void Show(){
        System.out.println(this.a);
    }
}
饿汉式和懒汉式的不同点:
饿汉式:直接先初始化对象。
懒汉式:对象是在方法被调用时,才初始化,也叫做对象的延时加载。
作者: qian0217wei    时间: 2015-6-12 00:07
还行,学完lock和unlock之后还可以在优化!
作者: zhaopy    时间: 2015-6-12 09:27
很常用,好东西,收下了!多谢楼主!!!
作者: zs1973    时间: 2015-6-12 10:18
qian0217wei 发表于 2015-6-12 00:07
还行,学完lock和unlock之后还可以在优化!

恩恩   等学完改一下
作者: zs1973    时间: 2015-6-12 10:19
:)哈哈哈
作者: 林豹    时间: 2015-6-12 12:34
多谢分享 好东西
作者: a1224577182    时间: 2015-6-12 21:21
顶一记,学习一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2