二十九、簡談設計模式

 

        模式設計(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣(百度百科)。本文將介紹幾種簡單的設計模式。

單例設計模式:

        解決一個類在內存中只有一個對象,多個程序使用統一配置信息對象時,需要保證該對對象的唯一性。

保證對象唯一性的實現步驟:

        1.將構造函數私有化:爲了避免其他程序過多建立該對象,禁止其他程序調用該對象。

        2.在類中創建一個本類對象:爲了讓其他程序可以訪問該類對象

        3.提供一個方法可以獲取到該對象的方法:方便其他程序訪問自定義的本類對象。

餓漢式:

        所謂餓漢式就是一進內存 就創建了對象

class single{ 

    private single(){}1.將構造函數私有化 

    private static single s=new single();2.在類中創建一個本類對象 

    public static single getInstance(){3.提供一個方法可以獲取到該對象的方法 

        return s; 

    } 

}

調用方式

public class SingleDemo { 

    public static void main(String[] args) {     

        single ss=single.getInstance(); 

    } 

}

懶漢式:

        所謂的餓漢式就是什麼時候調用什麼時候才創建對象,已達到對象的延時加載效果。

class single{ 

    private single(){} 

    private static single s=null; 

    public static single getInstance(){ 

{ 

if (s==null){ 

         s=single.getInstance(); 

} 

} 

        return s; 

    } 

}

兩種方式的比較:

    餓漢式是比較常用的一種方式,因爲它是線程安全的,而懶漢式相對來說使用的較少,因爲線程不安全。當然也可以使用同步來保證線程安全

裝飾設計模式

    顧名思義,所謂的裝飾模式就是爲了增強一個類的功能,所以在在其他類的基礎上進行裝飾(包裝)。

當想要對已有的獨享進行功能增強時,可以定義類,將已有的對象傳入,基於已經有的功能,並提供加強功能,那麼自定義的該類稱爲裝飾類。裝飾類通常會通過構造方法接收被裝飾的對象,並基於被裝飾的對象的功能,提供更強的功能(在IO流中使用比如BufferedReader等等)。

代碼演示:

已知類:

Person() 

{ 
      public void chifan() 
    
     { 
     } 
}

增強類:

superPerson() 
{ 

     private Person p; 

   superPerson(Person p) 

  { 

        this.p=p; 

  } 

public void superchifan() 
{ 

   p.chifan(); 

   ......... 

}

自定義裝飾類

package com.io; 

import java.io.*; 

public class MyBufferedReader { 

        private Reader r;     

    public MyBufferedReader(Reader r) { 

            super(); 

            this.r = r; 

        } 

        //可以一次讀取一行的方法 

         public String myReadLine() throws IOException 

         { 

             //定義一個臨時容器。StringBulider容器,應用於存儲字符數組 

             StringBuilder sb=new StringBuilder(); 

             int ch=0; 

             while((ch=r.read())!=-1){ 

                 if(ch=='\r') 

                         continue; 

                 if(ch=='\n') 

                     return sb.toString(); 

                 else 

                     sb.append((char)ch); 

             } 

              

             if(sb.length()!=0) 

                 return sb.toString(); 

             return null; 

         }      

         //複寫reader中的抽象方法 

         //複寫close方法 

         public void close() throws IOException 

         { 

             r.close(); 

         } 

         //複寫read方法 

         public int read (char[] c,int off,int len) throws IOException{ 

              

             return r.read(c, off, len); 

         } 

}

模板設計模式

        在我們定義功能時,功能的一部分是確定的,但是有一部分是不確定的,而確定的部分在使用不確定的部分,那麼就把這不確定的部分暴露出去,由該類的子類完成,這方思想就是模板設計模式

示例

abstract class GetTime 

{ 

    public final void getTime(){ 

        long start = System.currentTimeMillis(); 

        runcode(); 

        long end = System.currentTimeMillis(); 

        System.out.print("程序運行時間(毫秒):"+(end-start)); 

    public abstract void runcode(); 

    } 

} 

class SubTime extends GetTime 

{ 

    public void runcode(){ 

        for (int x =0;x<100 ;x++ ) 

        { 

            System.out.println(x); 

        } 

    } 

}

         GetTime類中getTime方法時爲了獲取某個程序運行的時間,因爲不知道會運行什麼程序,所以把程序封裝進一個抽象類中,當我們引用這個方法時,就必須得複寫其中的抽象方法runcode,同時繼承了getTime這個方法,從而達到檢測不同程序運行時間的效果。這就是模板設計模式。

        注意:不確定的部分不是非得是抽象的,因爲原有類中可能有默認的方法,我們在使用時,只需把它覆蓋即可,寫我們需要的內容即可。所以,不確定部分,可以是抽象的,也可以不是抽象的。

  

簡單工廠模式

構建一個工廠出來,在裏面進行生產,用的時候直接拿

我的總結:

好處:屏蔽不同子類實現的差異,提高代碼的可拓展性和可維護性;

package reviewDemo;
//簡單工廠模式

interface Phone{//制定標準,都要實現send()方法
	public void send();
}

class Iphone implements Phone{
	@Override
	public void send() {
		System.out.println("Iphone手機在發短信");
	}
}

class AndroidPhone implements Phone{
	@Override
	public void send() {
		System.out.println("AndroidPhone手機在發短信");
	}
}

class MyPhone implements Phone{
	@Override
	public void send() {
		System.out.println("MyPhone手機在發短信");
	}
}

class Factory{
	public static void show(String type){//傳入參數,根據不同的類型個性化定製
		if(type.equals("")){//爲空的情況,不用往下執行
			System.out.println("對不起,類型爲空!,請重新輸入!");
			return;
		}
		Phone p = null;
		if("Iphone".equals(type)){//判斷類型
			p = new Iphone();
		}else if("AndroidPhone".equals(type)){
			p = new AndroidPhone();
		}else{
			p = new MyPhone();
		}
		p.send();
	}
}

public class FactoryDemo17 {
	public static void main(String[] args) {
		
		new Factory().show("Iphone");//調用方法
		new Factory().show("AndroidPhone");
		new Factory().show("MyPhone");
		new Factory().show("YourPhone");
		new Factory().show("");
	}
}

 

輸出:

Iphone手機在發短信

AndroidPhone手機在發短信

MyPhone手機在發短信

MyPhone手機在發短信

對不起,類型爲空!

 享元模式

-128~127之間的特殊性。爲什麼要這樣設計,好處?
——>  享元模式(Flyweight Pattern):享元模式的特點是,複用我們內存中已存在的對象,降低系統創建對象實例。

自動裝箱:
Integer num1 = 12;

自動拆箱:
System.out.println(num1 + 12);
基本數據類型的對象緩存:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);
 
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4);//false
 
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12);
System.out.println(num5 == num6);//false


我的總結:對於享元模式,將最常用的封裝以便於我們可以複用!

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章