频道栏目
首页 > 资讯 > 其他 > 正文

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

17-03-14        来源:[db:作者]  
收藏   我要投稿

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

构造方法私有化,就不能直接在类的外面通过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,什么时候使用単例?

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

总结:

使用场景:

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

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

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

相关TAG标签
上一篇:JAVA设计模式之门面模式(外观模式)
下一篇:线性表
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站