单例模式的使用

来源:互联网 发布:淘宝电子书怎么没了 编辑:程序博客网 时间:2024/05/01 21:13

日子过得有点快,一天时间又过去了,好像没做得什么事情一样就已经看到日落的来临。不过感觉到今天收获还是挺不错的,因为自己在static 静态修饰符这一块的理解上一直挺欠缺的。难得是星期六,下着雨没什么地发可以去也只能说看看视频补一下自己的短板了吧。

首先我们先来说一下什么是单例模式,在我的理解了单例指的是只创造一个的意思,单例模式的存在能让我们更好的存储一些全局的配置信息,合理的使用内存,能够把它们统一存放内存的一块区域里在想使用的时候就把它调出来用,它的存在很好的为我们解决了一些编程上的难题,它是一种思想能够保证一个类在内存中的唯一性。

我们要创建单例模式那么我们需要做的有三点:

1、就是就是要保证类不能被外部随意的创建(new)。

2、就是本类只能够让自身创建一次。

3、就是外部可以通过某个方法调用。

要实现第一点我们就需要私有化类的构造函数:

<span style="white-space:pre"></span>private person(){            }
要实现第二点而点我们就需要自己创建一个静态的类:

<span style="white-space:pre"></span>private static person p1 = new person();

要实现第三点我们就提供一个public权限的方法给外部调用:

public static  person getInstance(String verify)    {        if (verify.equals( "mather"))        {            return p1;        }        else        {            return null;        }    }

三点都实现了,那么我们就调用一下是否能够能否实现原有的设想,我么在main函数中分别得到了两个person对象,然后分别给她们赋值和取值。最终结果发现无论是p1还是p 输出的结果都为同一内存地址的值

 person p=person.getInstance("mather");         System.out.println("国家是:"+p.getCONTRY()+" 姓名:"+p.getNAME()+" 年龄是:"+p.getAGE());        person p1=person.getInstance("mather");        p1.setNAME("lizhi");        System.out.println("国家是:"+p.getCONTRY()+" 姓名:"+p.getNAME()+" 年龄是:"+p.getAGE());
事实证明了在应用了单例模式后我们无乱从哪里调用person这个类始终只会得到同一个对象,这样的设计模式能让我们既能够轻松的实现了全局类的创建。

另外特别说一下,在单例模式中分别有懒汉模式和饿汉模式,它们本质上并没有太大的区别只是在类的自身创建时候的不同,一个是在类创建的时候就已经实例化了,而另一个则是在获取类调用getInstance()方法的时候才对类进行实例化。

懒汉模式:

public static person1 getInstance(String verify)    {        if (p1 == null)        {            p1=new person1();        }        return p1;    }
饿汉模式:

 private static person p1 = new person();
这两种模式平时的使用上没有什么不同,只有在线程中使用才会有区别,具体的不同还需要后面解释。

完整代码

package no8test;/** * 单例设计模式的使用 饿汉模式 事例类 * * @author zide */class person{    private static String CONTRY = "CN";    private static String NAME = "wangwag";    private static int AGE = 10;    private static person p1 = new person();    /**     * @return the CONTRY     */    public static String getCONTRY()    {        return CONTRY;    }    /**     * @param aCONTRY the CONTRY to set     */    public static void setCONTRY(String aCONTRY)    {        CONTRY = aCONTRY;    }    /**     * @return the NAME     */    public static String getNAME()    {        return NAME;    }    /**     * @param aNAME the NAME to set     */    public static void setNAME(String aNAME)    {        NAME = aNAME;    }    /**     * @return the AGE     */    public static int getAGE()    {        return AGE;    }    /**     * @param aAGE the AGE to set     */    public static void setAGE(int aAGE)    {        AGE = aAGE;    }     //私有化构造函数,防止类被实例化    private person(){            }    public static  person getInstance(String verify)    {        if (verify.equals( "mather"))        {            return p1;        }        else        {            return null;        }    }}/** * 单例设计模式的使用 懒汉模式 事例类 * * @author zide */class person1{    private static String CONTRY = "UK";    private static String NAME = "JAKE";    private static int AGE = 20;    private static person1 p1 = null;    /**     * @return the CONTRY     */    public static String getCONTRY()    {        return CONTRY;    }    /**     * @param aCONTRY the CONTRY to set     */    public static void setCONTRY(String aCONTRY)    {        CONTRY = aCONTRY;    }    /**     * @return the NAME     */    public static String getNAME()    {        return NAME;    }    /**     * @param aNAME the NAME to set     */    public static void setNAME(String aNAME)    {        NAME = aNAME;    }    /**     * @return the AGE     */    public static int getAGE()    {        return AGE;    }    /**     * @param aAGE the AGE to set     */    public static void setAGE(int aAGE)    {        AGE = aAGE;    }    //私有化构造函数,防止类被实例化    private person1(){            }    public static person1 getInstance(String verify)    {        if (p1 == null)        {            p1=new person1();        }        return p1;    }}public class single{       public static void main(String[] args){        person p=person.getInstance("mather");         System.out.println("国家是:"+p.getCONTRY()+" 姓名:"+p.getNAME()+" 年龄是:"+p.getAGE());        person p1=person.getInstance("mather");        p1.setNAME("lizhi");        System.out.println("国家是:"+p.getCONTRY()+" 姓名:"+p.getNAME()+" 年龄是:"+p.getAGE());    }     }<span style="color:#00cccc;"></span>




0 0