构造方法私有化--単例设计模式

面向对象的封装特性,最简单的是提现在对类的属性的封装,其实,类的方法也是可以进行封装的,构造方法,私有化,就是对构造方法的封装。

构造方法私有化,就不能直接在类的外面通过new 类名称();来实例化对象了,这样使用起来似乎不那么方便了,那么问题来了:

1,为何要私有化构造方法呢?

2,私有化了构造方法,就可以说采用了単例设计模式,那么,采用単例设计模式有什么优点?提供了什么方便?和没有使用単例模式相比有什么优势?就是说为什么要使用単例设计模式呢?

3,什么时候使用,単例设计模式呢?

class Singleton{
    private Singleton(){        // 将构造方法进行了封装,私有化   
    }
    public void print(){
        System.out.println("Hello World!!!") ;
    }
};

问题:

这样的代码,这个print方法,似乎永远无法被调用呢,因为实例化对象就会出问题,怎么实例化这个类的对象呢。。。。。

解决方案:

构造方法私有化了,不能再外面直接实例化对象了,那怎么办呢,那么在内部实例化咯,在类的内部实例化构造方法私有化的这个类的对象,从语法权限上来说,必然不会出问题。

问题:

在内部产生实例化对象,然后再传到外部,似乎有点绕。而且问题来了,如何把这个类内部产生的对象拿到外面呢?。。。。话不多说,上代码:

class Singleton{
    static Singleton instance = new Singleton() ;   // 在内部产生本类的实例化对象
    private Singleton(){        // 将构造方法进行了封装,私有化   
    }
    public void print(){
        System.out.println("Hello World!!!") ;
    }
};
public class SingletonDemo04{
    public static void main(String args[]){
        Singleton s1 = null ;   // 声明对象
        s1 = Singleton.instance ;   // 取得实例化对象
        s1.print() ;        // 调用方法
    }
};

以上代码实现了,私有化类内部创建对象,然后通过static修饰,拿到了外面,但是,这个属性并没有封装,不是很完美,可以进行优化:

优化

class Singleton{
    private static Singleton instance = new Singleton() ;   // 在内部产生本类的实例化对象
    public static Singleton getInstance(){      // 通过静态方法取得instance对象
        return instance ;
    }
    private Singleton(){        // 将构造方法进行了封装,私有化   
    }
    public void print(){
        System.out.println("Hello World!!!") ;
    }
};
public class SingletonDemo05{
    public static void main(String args[]){
        Singleton s1 = null ;   // 声明对象
        s1 = Singleton.getInstance() ;  // 取得实例化对象
        s1.print() ;        // 调用方法
    }
};

修改为这样,就好了很多了嘛。。。。

到了这里,就可以回答,开篇的地方的问题了—–为什么要使用単例呢?

class Singleton{
    private static Singleton instance = new Singleton() ;   // 在内部产生本类的实例化对象
    public static Singleton getInstance(){      // 通过静态方法取得instance对象
        return instance ;
    }
    private Singleton(){        // 将构造方法进行了封装,私有化   
    }
    public void print(){
        System.out.println("Hello World!!!") ;
    }
};
public class SingletonDemo05{
    public static void main(String args[]){
        Singleton s1 = null ;   // 声明对象
        Singleton s2 = null ;   // 声明对象
        Singleton s3 = null ;   // 声明对象
        s1 = Singleton.getInstance() ;  // 取得实例化对象
        s2 = Singleton.getInstance() ;  // 取得实例化对象
        s3 = Singleton.getInstance() ;  // 取得实例化对象
        s1.print() ;        // 调用方法
        s2.print() ;        // 调用方法
        s3.print() ;        // 调用方法
    }
};

这样在类的外部,无论创建了多少个对象,其实都是只创建了一个对象,都是通过getInstance()拿到的对象实例,也就是说,这里,s1,s2,s3,都使用了一个对象的引用,这些stack内存的引用都指向了一个heap内存。
分析:
这里写图片描述

开篇的问题

1,为何要将类的构造方法私有化呢?

当然是为了使用単例设计模式,

那么,什么是単例设计模式呢?这里了,就必须清楚的描述出来了:在程序的入口处(构造方法)限制了对象的实例化操作。构造方法私有化,在类的内部创建对象,然后通过static修饰然后封装这个对象,拿到外面使用,从而达到这个类从始至终只产生一个对象的目的的设计思路,就是単例设计。

2,使用単例有什么优点?

只产生一个对象实例,再多的对象也只是引用这一个对象实例,

3,什么时候使用単例?

当一个类只想创建一个对象实例的需求时候,当所有的对象都只有一个对象实例的引用的时候,就使用単例设计模式。

总结:

使用场景:

当要限制类的对象的产生的时候,就可以使用単例设计模式,

単例设计模式的核心就是:

将构造方法私有化,之后在类的内部产生实例化对象,并通过静态方法取得此实例化对象。

学习总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值