zoukankan      html  css  js  c++  java
  • 设计模式学习总结(九)--享元模式

    定义

    享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。

    享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。这个对象就可以避免到修改的问题。

    优缺点

    优点:

    • 享元模式的优点在于它能够极大的减少系统中对象的个数。

    • 享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。

    缺点:

    • 由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了。

    • 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。

    实例

    商品接口:

    public interface IGoods {
    
        String getDesc();
    
        BigDecimal getPrice();
    }
    

    具体商品:

    public class Mac implements IGoods {
        @Override
        public String getDesc() {
            return "苹果电脑";
        }
    
        @Override
        public BigDecimal getPrice() {
            return new BigDecimal(18888);
        }
    }
    

    商品工厂类:

    public class GoodsFactory {
        private static Map<String, IGoods> goodsPool = new HashMap<>();
    
        public static IGoods getGoods(String name) {
            if (goodsPool.containsKey(name)) {
                System.out.println("使用商品池中对象");
            }else{
                System.out.println("创建产品");
                goodsPool.put(name,new Mac());
            }
            return goodsPool.get(name);
        }
    }
    

    调用:

    public static void main(String[] args) {
        IGoods goods = GoodsFactory.getGoods("mac 2017款");
        System.out.println(String.format("产品名称: %s,产品价格:%s",goods.getDesc(),goods.getPrice()));
    
        goods = GoodsFactory.getGoods("mac 2017款");
        System.out.println(String.format("产品名称: %s,产品价格:%s",goods.getDesc(),goods.getPrice()));
    }
    

    控制台输出:

    创建产品
    产品名称: 苹果电脑,产品价格:18888
    使用商品池中对象
    产品名称: 苹果电脑,产品价格:18888
    
  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/markLogZhu/p/11582557.html
Copyright © 2011-2022 走看看