------------------------------------单例模式-----------------------------------------
² 单例模式(单态模式)(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
² 模式动机:对于系统中的某些类来说,只有一个实例很重要,例如:虽然系统中可以有许多打印机,但是只能有一个打印机正在工作,一个系统只能有一个窗口管理器。怎样保证一个对象只有第一次使用的时候实例化,以后要使用,就用第一次实例化的那个。某个界面点击菜单打开窗口,再次点击菜单,使用原来打开的那个窗口;windows里面的任务管理器
实例一:
class TaskManagerWindow1{ //任务管理器窗口
public TaskManagerWindow1(){
System.out.println("实例化一个窗口");
}
public void show(){
System.out.println("窗口显示");
}
}
class Test1{
public static void main(String[] args){
//点击任务栏菜单第一次
TaskManagerWindow1 tmw1 = new TaskManagerWindow1();
tmw1.show();
//点击任务栏菜单第二次
TaskManagerWindow1 tmw2 = tmw1;
tmw2.show();
/*该方法能够实现单例,但是实际工程中不可能实现,原因:
1:点击菜单栏第二次时候,你无法知道第一次窗口是否存在
2:TaskManagerWindow tmw2 = tmw1强迫程序员记住了tmw1,
如果代码很多,限制了程序员的工作
3:在多个模块中如果都允许点击菜单的话,别的模块不认识
本模块里面的局部变量tmw1,而传参数又太麻烦
*/
}
}
实例二:饿汉式
class TaskManagerWindow2{ //任务管理器窗口
//不管用不用,先实例化再说,这叫做饿汉式
private static TaskManagerWindow2 tmw = new TaskManagerWindow2();
public static TaskManagerWindow2 getInstance(){
return tmw;
}
private TaskManagerWindow2(){
System.out.println("实例化一个窗口");
}
public void show(){
System.out.println("窗口显示");
}
}
class Singleton2{
public static void main(String[] args){
//点击任务栏菜单第一次
TaskManagerWindow2 tmw1 = TaskManagerWindow2.getInstance();
tmw1.show();
//点击任务栏菜单第二次
TaskManagerWindow2 tmw2 = TaskManagerWindow2.getInstance();
tmw2.show();
}
}
实例三:懒汉式
class TaskManagerWindow4{ //任务管理器窗口
//需要用到时候再实例化,这叫做懒汉式(有安全隐患)
private static TaskManagerWindow4 tmw = null;
//安全隐患?多个线程都运行这个函数
public static TaskManagerWindow4 getInstance(){
if(tmw==null){
tmw = new TaskManagerWindow4();
}
return tmw;
}
private TaskManagerWindow4(){
System.out.println("实例化一个窗口");
}
public void show(){
System.out.println("窗口显示");
}
}
class Test4{
public static void main(String[] args){
//点击任务栏菜单第一次
TaskManagerWindow4 tmw1 = TaskManagerWindow4.getInstance();
tmw1.show();
//点击任务栏菜单第二次
TaskManagerWindow4 tmw2 = TaskManagerWindow4.getInstance();
tmw2.show();
}
}
实例四:
/*做一个Java界面1,上面有一个按钮
点击,出现一个红色的另外的界面2
再点击,出现的仍然是界面2,而不出现
新的界面,除非界面2关闭*/
class Frame1 extends Frame implements ActionListener{
Button btn = new Button("打开界面2");
public Frame1(){
Panel p = new Panel();
this.add(p);
p.add(btn);
btn.addActionListener(this);
this.setSize(200,300);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Frame2 frame = Frame2.newInstance();
frame.setVisible(true);
}
}
class Frame2 extends Frame implements ActionListener{
private static Frame2 f2 = new Frame2();
public static Frame2 newInstance(){
return f2;
}
private Button btn = new Button("关闭界面2");
private Frame2(){
Panel p = new Panel();
p.setBackground(Color.red);
this.add(p);
p.add(btn);
btn.addActionListener(this);
this.setSize(200,300);
}
public void actionPerformed(ActionEvent e) {
this.dispose();
}
}
class Singleton3 {
public static void main(String[] args) {
new Frame1();
}
}