1. 单例模式
-
含义:单例对象的类只能允许一个实例存在(一个类只有一个对象)
-
应用场景:例如网站的计数器,一般采用单例模式实现,如果存在多个计数器,每一个用户的访问都刷新计数器的值,从而计数的值是难以同步。采用单例模式就可以使多个用户只访问一个计数器,实现同步。(Windows系统的回收站,多线程的线程池设计与实现。。。)
- 单实例实现步骤:
- 类的构造方法定义为私有方法。
- 定义一个私有的类的静态实例。
- 提供一个公有的获取实例的静态方法。
- 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
单例模式完整代码,实现一个网站计数器和修改网站名
//单例模式
public class Singleton_Pattern {
private String name = "网址名为:乌龟站";
private int count; //计数
private static Singleton_Pattern instance = null; //定义一个私有的类的静态实例。
private Singleton_Pattern(){} //将类的构造方法定义为私有方法。
public static Singleton_Pattern getInstance() { //使用static,类可以直接访问,提供一个公有的获取实例的静态方法。
if (instance == null) { //判断对象是否存在
instance = new Singleton_Pattern();
System.out.println("单例模式创建成功,现在开始记录网站来访人数!");
}
return instance;
}
public void rename(){ //修改text变量
name="网址名为:大大的乌龟站";
}
protected String getName() { //获取text变量
return name;
}
public int getCount(){
return count;
}
public void addOne(){
this.count++;
System.out.println("来访用户+1!目前访问次数为:"+count);
}
}
- 其中static方法的作用:
- static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用。
- static方法中不能使用this和super关键字,不能调用非static方法,也不能访问非static类型的变量(因为类的对象可能还没被创建,或者创建多个对象,不知道调用哪个)。
- 单利模式的特点是该类只能有一个实例,为了实现这一功能,需把构造函数声明为private,并提供一个创建对象的方法。由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为static。
使用主函数调用:
class A {
public static void main(String[] args) {
Singleton_Pattern A1 = Singleton_Pattern.getInstance();
Singleton_Pattern A2 = Singleton_Pattern.getInstance();
Singleton_Pattern A3 = Singleton_Pattern.getInstance();
System.out.println(A1.getName());
A1.rename();
System.out.println("A1改名后:");
System.out.println("A1网址名为:"+A1.getName());
System.out.println("A2网址名为:"+A2.getName());
System.out.println("A3网址名为:"+A3.getName());
System.out.println("统计来访次数");
A1.addOne();
A2.addOne();
A3.addOne();
System.out.println("A1实例访次数 "+A1.getCount());
System.out.println("A2实例访次数 "+A2.getCount());
System.out.println("A2实例访次数 "+A2.getCount());
}
}
结果:
单例模式创建成功,现在开始记录网站来访人数!
网址名为:乌龟站
A1改名后:
A1网址名为:网址名为:大大的乌龟站
A2网址名为:网址名为:大大的乌龟站
A3网址名为:网址名为:大大的乌龟站
统计来访次数
来访用户+1!目前访问次数为:1
来访用户+1!目前访问次数为:2
来访用户+1!目前访问次数为:3
A1实例访次数 3
A2实例访次数 3
A2实例访次数 3
- 可以看出创建了三个对象A1A2A3,A1改名后A2A3实例的名也变了,并且A1A2A3都使用addOne()后,它们总的计数器值都一致,说明只创建了一个对象。
资料