設計模式筆記之享元模式的使用
阿新 • • 發佈:2019-01-03
簡介:享元模式(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"); } }