1. 程式人生 > >設計模式筆記之享元模式的使用

設計模式筆記之享元模式的使用

簡介:享元模式(Flyweight Pattern)主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。享元模式嘗試重用現有的同類物件,如果未找到匹配的物件,則建立新物件。

意圖:運用共享技術有效地支援大量細粒度的物件。

主要解決:在有大量物件時,有可能會造成記憶體溢位,我們把其中可重用物件在建立後儲存起來,當再次需要時,直接返回在記憶體中已有的物件,避免重新建立。

缺點:提高了系統的複雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨著內部狀態的變化而變化,否則會造成系統的混亂。

使用場景: 1、系統有大量相似物件。 2、需要緩衝池的場景。

實現案例:資料庫連線物件的建立與使用,首先定義連線物件介面ConnectInterf,具體實現物件ConnectObj,在多次使用同一個連線物件時,只有第一次是建立的,其他的都是從儲存器中獲取。

例如下:

public interface ConnectInterf {

	public void ConnectObj(String sql);
}
public class ConnectEntity implements ConnectInterf {

	String dbNameAndUserName;
	
	
	public ConnectEntity(String dbNameAndUserName) {
		super();
		this.dbNameAndUserName = dbNameAndUserName;
	}

	public String getDbNameAndUserName() {
		return dbNameAndUserName;
	}

	public void setDbNameAndUserName(String dbNameAndUserName) {
		this.dbNameAndUserName = dbNameAndUserName;
	}

	@Override
	public void ConnectObj(String sql) {
		System.out.println("執行sql:"+sql);
		
	}

}
public class ConnectFactory {

	private static final Map<String,ConnectEntity> conObjs=new HashMap<String,ConnectEntity> ();
	
	public static ConnectEntity  getConnectObj(String dbAndUserName) {
		if(!conObjs.containsKey(dbAndUserName)) {
			ConnectEntity ce=new ConnectEntity(dbAndUserName);
			conObjs.put(dbAndUserName, ce);
			System.out.println("新建立一個"+dbAndUserName+"連線");
			return ce;
		} else {
			System.out.println("直接獲取");
			return conObjs.get(dbAndUserName);
		}
	}
	
}
public class TestClass {

	public static void main(String[] args) {
		ConnectEntity ce=ConnectFactory.getConnectObj("orcl:scott");
		ce.ConnectObj("select * from dual");
		ConnectEntity ce2=ConnectFactory.getConnectObj("orcl:userA");
		ce2.ConnectObj("select * from dual");
		ConnectEntity ce3=ConnectFactory.getConnectObj("orcl:userB");
		ce3.ConnectObj("select * from dual");
		
		ConnectEntity ce4=ConnectFactory.getConnectObj("orcl:scott");

	}

}