单例模式是一种常用的软件设计模式顾名思义就是在一个程序中只存在一个实例,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。下面我们通过几个方面来分部解析单例模式的实现方式。
第一步:构造方法私有化
我们在设计一个程序类时(也就是对象),在每次想要执行类中的方法时我们就需要创建一个对象,下面代码我们来看看普通类的设计方式:
public class Person{
private int age;
private String name;
public Person(){}
public Person(int age,String name){
this.age = age;
this.name = name;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
一般情况下,我们对一个类的基本操作为让其属性私有化,内部的方法公有化,在创建一个对象时使用new关键字对其进行实例化,外部是可以看见其构造方法,并且在实例化对象时,调用其构造方法,也就是将构造方法暴露给外界,每次实例化对象时,都会生成一个新的对象。而单例模式所需要做的第一步就是,将构造方法私有化:
public class Person{
private int age;
private String name;
private Person(){}
private Person(int age,String name){
this.age = age;
this.name = name;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
但是如果将构造方法私有化之后,我们进行对象的创建,此时编译器会报错,如图:
提示我们构造方法为私有的无法通过外部访问。
第二步:在类内部构造自己
因为我们的构造方法的访问权限为private,也就表明构造方法只能在类内部被创建,所以我们需要修改其内部实现:
public class Person{
private Person person = new Person();
private int age;
private String name;
private Person(){}
private Person(int age,String name){
this.age = age;
this.name = name;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
但是这样修改还是无法正常创建实例,因为没有个开口去返回在类中创建的实例,所以我们还需要一个方法去执行这个操作,但是我们又无法通过创建对象来获取方法,所以需要一个静态方法getInstance去返回实例对象,但是静态方法是在程序加载的时候就已经实现了的,而对象person是在程序实例化时才会生成,所以需要将实例化的操作也变成静态的才能够实现:
public class Person{
private static Person person = new Person();
private int age;
private String name;
private Person(){}
private Person(int age,String name){
this.age = age;
this.name = name;
}
public static Person getInstance(){
return person;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
也就是将此对象生成放在静态资源中,然后使用getInstance方法将其返回给用户,这样我们就实现了对象的创建,代码如下:
由此,我们就创建了一个单例模式的对象person。
当然,单例中也分好多种模式的单例设计,还包括多线程下的线程安全问题,这个将在后续文章中进行详细说明。
最后,对单例模式做个总结:
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
有三点需要注意:
1.单例类只能有一个实例。
2.单例类必须自己创建自己的唯一实例。
3.单例类必须给所有其他对象提供这一实例。