定義:面向對象技術可以很好地解決一些靈活性或可擴充性問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,将導緻運作代價過高,帶來性能下降等問題。
優點:1.減少了對象的創立,減少了記憶體的使用
缺點:1.提高了系統的複雜度。
2.需要分離出内部狀态和外部狀态,而外部狀态具有固化特性,不應該随着内部狀态的改變而改變
使用場景:1.String常量池、資料庫連接配接池、緩沖池等等都是享元模式
原理:1緩存對象,統一管理,不必挨個建立,用 HashMap 存儲這些對象。(建立對象池),
類圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yN3IjZjlTYhV2Y5QjY4MDOwUTO0UjN4gDMmJ2MiJmYz8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
執行個體代碼:
抽象享元角色
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. }