将构造方法使用private封装.范例1:
class Singleton{
private Singleton(){
}
public void print(){
System.out.println("hello") ;
}
}
public class Demo{
public static void main(String args[]){
Singleton inst = null ; //声明对象
inst = new Singleton() ; //实例化对象
inst.print() ;
}
}
编译结果:
以上程序在实例化Singleton对象时出现了编译错误,因为构造方法被私有化了,无法在外部调用,即无法在外部实例化Singleton对象.
那么如何在保证构造方法和print()方法不修改的情况下让类的外部通过构造方法再去低啊用print()方法呢?
第一步:
使用private定义的操作只能被本类访问,外部无法调用,那么此时就说明这个类的构造方法只能被本类所调用,那么现在在本类中产生本类实例化对象:
class Singleton{
Singleton instance = new Singleton() ;
private Singleton(){
}
public void print(){
System.out.println("hello") ;
}
}
public class Demo{
public static void main(String args[]){
Singleton inst = null ;
//inst = new Singleton() ;
//inst.print() ;
}
}
以上程序编译可以通过.
第二步:
对于一个类中的普通属性,一定要在本类存在了实例化对象后才可以调用,但现在在Singleton类的外部无法产生实例化对象,那么此时必须要让Singleton类中的instance属性可以在没有Singleton类实例化对象时进行调用.那么此时可以使用static完成,static定义的属性特点:由类名称直接调用,并且在没有实例化对象时也可以调用.
class Singleton{
static Singleton instance = new Singleton() ;
private Singleton(){
}
public void print(){
System.out.println("hello") ;
}
}
public class Demo{
public static void main(String args[]){
Singleton inst = null ;
inst = Singleton.instance ;
inst.print() ;
}
}
运行结果:
第三步:
类中的全部属性,都应该封装,所以以上的instance属性应该封装,而封装后的访问需要getter方法,不过此时的getter方法应该由类名称直接调用,定义为static型.
class Singleton{
private static Singleton instance = new Singleton() ;
private Singleton(){
}
public void print(){
System.out.println("hello") ;
}
public static Singleton getInstance(){
return instance ;
}
}
public class Demo{
public static void main(String args[]){
Singleton inst = null ;
inst = Singleton.getInstance() ;
inst.print() ;
}
}
运行结果:
第四步:
如此做的目的是什么?此时的instance属性属于static,表示所有的Singleton类的对象,不管有多少个都共同拥有同一个instance属性.如果现在一个类只希望有唯一的一个实例化对象出现,那就需要将构造方法使用private隐藏起来,使其对外部不可见,那么外部就无法执行对象的实例化操作.
但是还可能出现如下的操作:
class Singleton{
private static Singleton instance = new Singleton() ;
private Singleton(){
}
public void print(){
System.out.println("hello") ;
}
public static Singleton getInstance(){
instance = new Singleton() ;
return instance ;
}
}
虽然以上代码被允许使用,可是如果这么做,之前表示的
唯一一个实例化对象的所有努力都白费了,所以应该费废除这种做法,此时,可以再定义instance时增加一个final关键字:
class Singleton{
private final static Singleton instance = new Singleton() ;
private Singleton(){
}
public void print(){
System.out.println("hello") ;
}
public static Singleton getInstance(){
return instance ;
}
}
public class Demo{
public static void main(String args[]){
Singleton inst = null ;
inst = Singleton.getInstance() ;
inst.print() ;
}
}
运行结果:
这样的代码在设计模式上称为:单例设计模式(Singleton)
单例设计模式的主要特点:构造方法被私有化,只能够通过getInstance()方法取得Singleton类的实例化对象,这样不管外部如何操作,最终也只有一个实例化对象,在单例设计模式中一定会存在一个static方法,用于取得本类的实例化对象.
单例设计模式只留有一个类的实例化对象,而多例设计模式会定义出多个对象.
范例:
class Sex{
private static final Sex MALE = new Sex("男") ;
private static final Sex FEMALE = new Sex("女") ;
private String title ;
private Sex(String title){
this.title = title ;
}
public static Sex getInstance(String msg){
switch(msg){
case"male":
return MALE ;
case"female":
return FEMALE ;
default:
return null ;
}
}
public String getTitle(){
return this.title ;
}
}
public class Demo{
public static void main(String args[]){
Sex male = Sex.getInstance("male") ;
System.out.println(male.getTitle()) ;
}
}
运行结果: