JavaSE之单例设计模式&多例设计模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HL_HLHL/article/details/83964373

单例模式

单例模式设计指的是一个类只允许产生一个实例化对象。单例设计模式有两种形式:懒汉式、饿汉式。
那么怎么才能使一个类只产生一个实例化对象呢?我们先从它的实现上来考虑,一个类进行实例化的时候是通过调用构造函数来实现的,一般我们用public访问权限来修饰构造函数,想定义多少个对象就定义多少个对象。但是现在要只产生一个实例化对象,我们就联想到,将它的访问权限修改为private,不允许类外部访问,只允许类内部访问。也就是说private修饰构造函数之后,我们不能在类外面进行对象实例化,只能在类里面进行对象实例化 Singleton SINGLENTON=new Singleton();。但是此时类的对象(属性)是一个普通属性,所有的普通属性必须在有实例化对象的时候才能进行内存空间的分配,而现在外部无法产生实例化对象,所以必须想一个办法,可以在类没有实例化对象产生的时候,也可以使用SINGLENTON。此时,就联想使用static关键字。**static修饰的静态对象变量在类加载的时候就已经对对象进行实例化,分配内存。**为了实现只产生一个实例化对象,SINGLENTON这个属性自然也是要private来修饰,对外部不可见,一般还会追加一个final关键字。要想取得private属性也应该提供getter()方法,由于此时访问的是static属性,并且这个类无法在外部提供实例化对象,因此应该提供一个static的getter()方法,因为static方法也不受对象实例化控制。具体实现看下面代码:

饿汉式单例:上来就new

class Singleton{
    //类内进行对象实例化
    private final static  Singleton SINGLENTON=new Singleton();
    //private修饰构造函数,此时构造函数只能在类内访问不能在类外访问
    private Singleton(){};
    //静态的获得实例化后的对象的函数
    public static Singleton GetSinglenton(){
        return SINGLENTON;
    }
}
public class Test {
    public static void main(String[] args) {
       Singleton sin1=Singleton.GetSinglenton();
        Singleton sin2=Singleton.GetSinglenton();
        Singleton sin3=Singleton.GetSinglenton();
        System.out.println(sin1);//hhh.pre.java.Singleton@4554617c
        System.out.println(sin2);//hhh.pre.java.Singleton@4554617c
        System.out.println(sin3);//hhh.pre.java.Singleton@4554617c
    }
}

懒汉式单例:用时再new(双重加锁单例模式)

class Singleton{
    //声明一个类对象
    private static Singleton SINGLENTON;
    //构造方法
    private Singleton(){};
    //对对象进行实例化,并且返回实例化后的对象
    public static Singleton GetSinglenton(){
        if(SINGLENTON==null){
            SINGLENTON=new Singleton();
        }
        return SINGLENTON;
    }
}
public class Test {
    public static void main(String[] args) {
       Singleton sin1=Singleton.GetSinglenton();
        Singleton sin2=Singleton.GetSinglenton();
        Singleton sin3=Singleton.GetSinglenton();
        System.out.println(sin1);
        System.out.println(sin2);
        System.out.println(sin3);
    }
}

饿汉式和懒汉式的区别

饿汉式:是在类加载的时候就已经产生实例化操作了
懒汉式:当第一次去适应类对象的时候才会为其产生实例化对象的操作。
一般我们都使用饿汉式单例模式而不采用懒汉式单例模式,因为懒汉式单例模式在多线程的时候会出现线程安全问题,至于我为什么?我现在也不知道等我学习了多线程再回来补这个坑吧~~~~但是我知道双重加速单例模式可以解决懒汉单例模式这个坑~感兴趣的童鞋可以自己先了解了解
单例模式的特点:构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象

多例设计模式

什么是多例设计模式呢?假如要求描述一周数的类,只能有七个对象;描述性别的类,只能有两个。这些都属于多例设计模式(有限个数对象)。
所谓的多例只是比单例追加了更多个内部实例化对象产生而已。
范例:实现性别多例设计模式

class Sex{
    private String title;
    public static final int MALE_FLAG=1;
    public static final int FEMALE_FLAG=2;
    private static final Sex MALE=new Sex("男");
    private static final Sex FEMALE=new Sex("女");
    private Sex(String title){
        this.title=title;
    }
    public static Sex GetSex(int sex) {
       switch (sex) {
           case 1:
               return MALE;
           case 2:
               return FEMALE;
               default:
                   return null;
       }
    }
    public String toSting(){
        return this.title;
    }
}
public class Test {
    public static void main(String[] args) {
       Sex male=Sex.GetSex(Sex.MALE_FLAG);
        System.out.println(male.toSting());
    }
}

不管是多例还是单例都有共同特点:
1.构造方法私有化
2.类内部一定会提供一个static方法用于取得实例化对象
总结:单例和多例的代码我们编写的几率并不高,但是对于代码结果我们一定要清楚,尤其是单例设计。多例设计模式我们先理解概念,该概念已经被枚举所取代。

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/83964373