享元模式

本文转载:https://blog.csdn.net/qq_20143059/article/details/102593200

定义:面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。

优点:1.减少了对象的创立,减少了内存的使用

缺点:1.提高了系统的复杂度。

           2.需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变

使用场景:1.String常量池、数据库连接池、缓冲池等等都是享元模式

原理:1缓存对象,统一管理,不必挨个创建,用 HashMap 存储这些对象。(建立对象池),

类图:

实例代码:

抽象享元角色

 
    interface IFlyweight {
        void operation(String extrinsicState);
    }


具体享元角色
 

 static class ConcreteFlyweight implements IFlyweight {
        private String intrinsicState;
 
        public ConcreteFlyweight(String intrinsicState) {
            this.intrinsicState = intrinsicState;
        }
 
        @Override
        public void operation(String extrinsicState) {
            //方法。。。。
        }
    }

 


享元工厂

 
    static class FlyweightFactory {
        private static Map<String, IFlyweight> pool = new HashMap<>();
 
        // 因为内部状态具备不变性,因此作为缓存的键
        public static IFlyweight getFlyweight(String intrinsicState) {
            if (!pool.containsKey(intrinsicState)) {
                IFlyweight flyweight = new ConcreteFlyweight(intrinsicState);
                pool.put(intrinsicState, flyweight);
            }
            return pool.get(intrinsicState);
        }
    }

 


调用

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

 


栗子
抽象享元角色

    //选肥皂
    interface IChooseSoap{
 
        void toChoose(String soapColor);
    }

具体享元角色



public class ChooseSoap extends IChooseSoap{
 
    private String name = "";
    
    public ChooseSoap (String color) {
        this.name = name;
    }
    
    @Override
    public void toChoose() {
        System.out.println("肥皂颜色是:" + color);
    }
    
}

 


工厂类(处理内部对象)

 

public class Factory {
 
    private HashMap<String, IChooseSoap> pool = new HashMap<>();
    
    //获得肥皂
    public IChooseSoap chooseSoap(String color) {
        //如果没有这个颜色的 就买一个放在池中
        if(!pool.containsKey(color)) {
            pool.put(color, new ChooseSoap(keycolor);
        }
        //如果池中有 那么就在池中取
        return (IChooseSoap)pool.get(color);
    }    
}

 


调用

public class Client {
 
    public static void main(String[] args) {
        Factory Factory = new Factory();
        Factory.chooseSoap('粉色');
    }
    
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值