天天看點

享元模式

定義:面向對象技術可以很好地解決一些靈活性或可擴充性問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,将導緻運作代價過高,帶來性能下降等問題。

優點:1.減少了對象的創立,減少了記憶體的使用

缺點:1.提高了系統的複雜度。

           2.需要分離出内部狀态和外部狀态,而外部狀态具有固化特性,不應該随着内部狀态的改變而改變

使用場景:1.String常量池、資料庫連接配接池、緩沖池等等都是享元模式

原理:1緩存對象,統一管理,不必挨個建立,用 HashMap 存儲這些對象。(建立對象池),

類圖:

享元模式

執行個體代碼:

抽象享元角色

1. 
2. interface IFlyweight {
3. void operation(String extrinsicState);
4.     }      

具體享元角色

1. static class ConcreteFlyweight implements IFlyweight {
2.         private String intrinsicState;
3. 
4.         public ConcreteFlyweight(String intrinsicState) {
5.             this.intrinsicState = intrinsicState;
6.         }
7. 
8.         @Override
9.         public void operation(String extrinsicState) {
10.             //方法。。。。
11.         }
12.     }      

享元工廠

1. 
2. static class FlyweightFactory {
3. private static Map<String, IFlyweight> pool = new HashMap<>();
4. 
5. // 因為内部狀态具備不變性,是以作為緩存的鍵
6. public static IFlyweight getFlyweight(String intrinsicState) {
7. if (!pool.containsKey(intrinsicState)) {
8.                 IFlyweight flyweight = new ConcreteFlyweight(intrinsicState);
9.                 pool.put(intrinsicState, flyweight);
10.             }
11. return pool.get(intrinsicState);
12.         }
13.     }      

調用

1. class Client {
2. public static void main(String[] args) {
3.         IFlyweight flyweight1 = FlyweightFactory.getFlyweight("aa");
4.         IFlyweight flyweight2 = FlyweightFactory.getFlyweight("bb");
5.         flyweight1.operation("a");
6.         flyweight2.operation("b");
7.     }      

栗子

1. //選肥皂
2. interface IChooseSoap{
3. 
4. void toChoose(String soapColor);
5.     }      
1. 
2. 
3. public class ChooseSoap extends IChooseSoap{
4. 
5. private String name = "";
6. 
7.     public ChooseSoap (String color) {
8. this.name = name;
9.     }
10. 
11. @Override
12.     public void toChoose() {
13. System.out.println("肥皂顔色是:" + color);
14.     }
15. 
16. }      

工廠類(處理内部對象)

1. public class Factory {
2. 
3. private HashMap<String, IChooseSoap> pool = new HashMap<>();
4. 
5. //獲得肥皂
6. public IChooseSoap chooseSoap(String color) {
7. //如果沒有這個顔色的 就買一個放在池中
8. if(!pool.containsKey(color)) {
9.             pool.put(color, new ChooseSoap(keycolor);
10.         }
11. //如果池中有 那麼就在池中取
12. return (IChooseSoap)pool.get(color);
13.     }
14. 
15. 
16. }      
1. public class Client {
2. 
3. public static void main(String[] args) {
4. Factory Factory = new Factory();
5. Factory.chooseSoap('粉色');
6.     }
7. 
8. }