博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式是梳理——享元模式
阅读量:4095 次
发布时间:2019-05-25

本文共 2076 字,大约阅读时间需要 6 分钟。

一、概述

       享元模式(Flyweight),运用共享技术有效的支持大量细粒度的对象。

二、UML图示

 

 

三、代码实现

        某宝商城卖商品,如果每个用户下单都生成商品对象显然会耗费很多资源,如果赶上双11,那恐怖的订单量会生成很多商品对象,更何况商城卖的商品种类繁多,这样就极易会产生OOM。因此我们采用享元模式来对商品的创建进行优化。

public interface IGoods {    public void showGoodsPrice(String name);}

具体享元角色

      定义类Goods,它实现IGoods 接口,并实现了showGoodsPrice方法,如下所示。

public class Goods implements IGoods{    private String name;//名称    private String version;//版本    Goods(String name){        this.name=name;    }    @Override    public void showGoodsPrice(String version) {        if(version.equals("32G")){            System.out.println("价格为5199元");        }else if(version.equals("128G")){            System.out.println("价格为5999元");        }    }}

       其中name为内部状态,version为外部状态。showGoodsPrice方法根据version的不同会打印出不同的价格。

享元工厂

public class GoodsFactory {    private static Map
pool=new HashMap
(); public static Goods getGoods(String name){ if(pool.containsKey(name)){ System.out.println("使用缓存,key为:"+name); return pool.get(name); }else{ Goods goods=new Goods(name); pool.put(name,goods); System.out.println("创建商品,key为:"+name); return goods; } }}

        享元工厂GoodsFactory 用来创建Goods对象。通过Map容器来存储Goods对象,将内部状态name作为Map的key,以便标识Goods对象。如果Map容器中包含此key,则使用Map容器中存储的Goods对象,否则就新创建Goods对象,并放入Map容器中。

客户端调用

       客户端中调用GoodsFactory的getGoods方法来创建Goods对象,并调用Goods 的showGoodsPrice方法来显示产品的价格,如下所示。

public class Client {    public static void main(String[]args) {        Goods goods1=GoodsFactory.getGoods("iphone7");        goods1.showGoodsPrice("32G");        Goods goods2=GoodsFactory.getGoods("iphone7");        goods2.showGoodsPrice("32G");        Goods goods3=GoodsFactory.getGoods("iphone7");        goods3.showGoodsPrice("128G");    }}运行结果为: 创建商品,key为:iphone7 价格为5199元 使用缓存,key为:iphone7 价格为5199元 使用缓存,key为:iphone7 价格为5999元

        从输出看出,只有第一次是创建Goods对象,后面因为key值相同,所以都是使用了对象池中的Goods对象。在这个例子中,name作为内部状态是不变的,并且作为Map的key值是可以共享的。而showGoodsPrice方法中需要传入的version值则是外部状态,他的值是变化的。

享元模式的使用场景

  • 系统中存在大量的相似对象。
  • 需要缓冲池的场景。
  • 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份。

参考文献:

                  

                《大话设计模式》程杰著。

 

 

 

 

 

 

 

 

你可能感兴趣的文章
[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux select TCP并发服务器与客户端编程
查看>>
Linux系统编程——线程池
查看>>
基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
查看>>
Linux 线程信号量同步
查看>>
C++静态成员函数访问非静态成员的几种方法
查看>>
类中的静态成员函数访问非静态成员变量
查看>>
C++学习之普通函数指针与成员函数指针
查看>>
C++的静态成员函数指针
查看>>
Linux系统编程——线程池
查看>>
yfan.qiu linux硬链接与软链接
查看>>
Linux C++线程池实例
查看>>
shared_ptr简介以及常见问题
查看>>
c++11 你需要知道这些就够了
查看>>
c++11 你需要知道这些就够了
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>