------------------------------------單例模式-----------------------------------------
² 單例模式(單態模式)(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();
}
}