设计模式之单例模式与多例模式

单例模式

什么是单例模式?

答:有些类在一整个软件体系中可能只能产生一个对象,就好比太阳系里面,太阳这个类只能实例化一个太阳,如果实例化两次就出问题了。所以限制一个类只能实例化一个对象,就是单例模式。

如何限制别人来new出新对象?

在java中,使用private修饰构造函数,限制外部不能调用构造函数,从而限制实例化。

而我们在类的内部直接new出想要的对象个数(单例模式就是1个对象)就可以了。

怎么实现?

java代码实现如下:(代码不正确,请往下看)

class Singleton{
    private Singleton SINGLETON = new Singleton();
    private Singleton(){}
}

会不会有问题?

会!现在Singleton内部的instance对象(属性)是一个普通属性,所有的普通属性必须在有实例化对象的时候才能进行内 存空间的分配,而现在外部无法产生实例化对象,所以必须想一个办法,可以在Singleton没有实例化对象产生的时 候,也可以将instance进行使用。此时,联想到使用static关键字,再写相应的get函数就好。

class Singleton{
    private static final Singleton SINGLETON = new Singleton();
    private Singleton(){}
    public static Singleton getSINGLETON() {
        return SINGLETON;
    }
}

这也叫饿汉式单例。

还有懒汉式单例:区别在于第一次构造再实例化对象,但这个存在问题,在高并发情况下,有时候会产生两个对象,所以不建议使用!!!(当然也有解决方案,但比较复杂)

class Singleton2{
    private static Singleton2 SINGLETON;
    private Singleton2(){}
    public static Singleton2 getSINGLETON() {
        if (SINGLETON == null){
            SINGLETON = new Singleton2();
        }
        return SINGLETON;
    }
}

多例模式——有限个数对象

多例模式只是比单例模式多了一些内部实例化对象产生。

其实无论单例还是多例

  1. 构造方法私有化
  2. 类内部提供静态方法返回有限个数对象

就可以了

例子:

//多例模式
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 getInstance(int flag) {  
        switch (flag) {  
            case MALE_FLAG:  
                return MALE ;
            case FEMALE_FLAG: 
                return FEMALE ;
            default:         
                return null ; 
        }    
    }   
    @Override 
    public String toString() {
        return this.title ;  
    }
}

猜你喜欢

转载自blog.csdn.net/likunkun__/article/details/83515006