Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己

对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广

泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Flyweight(享元模

式)模式是比较常用的一个模式。


   Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.

应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是

重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中.


   定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元

类)。
   设计初衷:面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时

对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个

字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的

共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用

(context),是不可共享的.
  
   在此 以咖啡外卖店为例 写了4个java类来描述说明Flyweight设计模式的实现方式;
   客户买咖啡下订单,订单只区分咖啡口味,如果下了1W个订单,而咖啡店只卖20

种口味的咖啡,那么我们就没有必要生成1W个订单对象,通过享元模式我们只需要

生成20个订单对象。


   这个例子举的不太好,但足以说明问题。下面是具体的代码。
  

  1、 Order.java         订单抽象类


  2、 FlavorOrder.java   订单实现类


  3、 FlavorFactory.java 订单生成工厂


  4、 Client.java        客户类、带有main方法的测试类


===============   1、 Order.java
package flyweight;
public abstract class Order {//执行卖出动作public abstract void sell();//获取咖啡口味public abstract String getFlavor();
}
===============   1   end
===============   2、 FlavorOrder.java
package flyweight;
public class FlavorOrder extends Order{ private String flavor;public FlavorOrder(String flavor){this.flavor = flavor;}public String getFlavor(){return this.flavor;}public void sell(){System.out.println("卖出一杯 [" + flavor + "]。" );}
}
===============   2   end
===============   3、 FlavorFactory.java
package flyweight;
import java.util.HashMap;
import java.util.Map;
public class FlavorFactory {//订单池private Map<String,Order> flavorPool = new HashMap<String,Order>(20);//静态工厂,负责生成订单对象private static FlavorFactory flavorFactory = new FlavorFactory();private FlavorFactory() {}public static FlavorFactory getInstance() {return flavorFactory;}//获得订单public Order getOrder(String flavor) {Order order = null;if(flavorPool.containsKey(flavor)){order = flavorPool.get(flavor);}else{//获得新口味订单order = new FlavorOrder(flavor);//放入对象池flavorPool.put(flavor, order);   }return order;}//获得已经卖出的咖啡全部口味数量public int getTotalFlavorsMade() {return flavorPool.size();}
}
===============   3   end
===============   4、 Client.java
package flyweight;
import java.util.ArrayList;
import java.util.List;
public class Client {//客户下的订单private static List<Order> orders = new ArrayList<Order>(100);//订单对象生成工厂private static FlavorFactory flavorFactory;//增加订单private static void takeOrders(String flavor) {orders.add(flavorFactory.getOrder(flavor));}public static void main(String[] args) {//订单生成工厂flavorFactory = FlavorFactory.getInstance();//增加订单takeOrders("摩卡");takeOrders("卡布奇诺");takeOrders("香草星冰乐");takeOrders("香草星冰乐");takeOrders("拿铁");takeOrders("卡布奇诺");takeOrders("拿铁");takeOrders("卡布奇诺");takeOrders("摩卡");takeOrders("香草星冰乐");takeOrders("卡布奇诺");takeOrders("摩卡");takeOrders("香草星冰乐");takeOrders("拿铁");takeOrders("拿铁");//卖咖啡for(Order order : orders){order.sell();}//打印生成的订单java对象数量System.out.println("n客户一共买了 " +  orders.size() + " 杯咖啡! ");//打印生成的订单java对象数量System.out.println("n共生成了 " +  flavorFactory.getTotalFlavorsMade() + " 个 FlavorOrder java对象! ");}
}
===============   4   end

java设计模式---享元模式相关推荐

  1. 【设计模式】Java设计模式 - 享元模式

    [设计模式]Java设计模式 - 享元模式

  2. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  3. JAVA设计模式--享元模式

    目录 一.什么是享元模式 二.享元模式在Java中的典型应用 三.享元模式的结构 单纯享元模式 复合享元模式 四.享元模式应用举例 五.享元模式的适用性 六.享元模式的特点 七.总结 一.什么是享元模 ...

  4. Java设计模式----------享元模式

    1.介绍 享元模式通过尽可能的复用已经存在的对象,从而尽量少的创建新对象,以节约系统的内存和提供系统性能.在享元模式中,对象的属性分为两种,内部状态和外部状态.内部状态指的是对象中不随外部变化的属性, ...

  5. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  6. 10-Python与设计模式--享元模式

    10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...

  7. 设计模式--享元模式实现C++

    /********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...

  8. Unity设计模式——享元模式(附代码)

    Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...

  9. 第二十二章 Caché 设计模式 享元模式

    文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...

最新文章

  1. latex中插入代码
  2. javascript:函数的apply,call方法和length属性
  3. python实现点到平面的距离
  4. 软件设计原则(七)合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
  5. 前端学习(1768):前端调试值之内存监控的原理和方法三
  6. 深度学习最常用的学习算法:Adam优化算法
  7. jeecg3.8popup弹出窗口触发失去焦点事件,引发验证弹窗,影响体验问题的解决办法
  8. Spring-tx-TransactionStatus接口(savepoint)
  9. Android开发环境搭建-eclipse+ADT及hello world
  10. linux下分析prn文件,linux专题一之文件描述符、重定向、管道符、tee命令
  11. 方差公式Var(x)=E(x^2)-[E(x)]^2,求期望值
  12. 华为虚拟化usb服务器,华为FusionComputer服务器虚拟化完美解决方案
  13. RESTful API入门学习笔记
  14. 转载: 找不到MSVCR90.dll、Debug vs Release及cppLapack相关
  15. 移动公网5G配置(一)
  16. AI实战:文本自动摘要简述
  17. EduCoder_web实训作业--JavaScript学习手册四:JS对象
  18. PixiJS学习(10)事件机制
  19. CSS中那些px、em、pt、rem、%、dp(android)单位
  20. 感觉 C++ 很简单,但为何这么多劝退的?

热门文章

  1. YYDispatchQueuePool 学习笔记
  2. 觉得酒驾处罚太严厉?看看国外的再说吧...
  3. ASI和AFN的区别
  4. 看一个穷人怎样拥有多套房产的?-财富可以这样成长
  5. 关于一些朋友想做在线教育的回复和分享
  6. 使用PHP处理POST上传时$_FILES数组为何为空
  7. Android Navigation Drawer(导航抽屉)
  8. 【推荐】ZendStudio 5.5.1 开发调试(Debug)配置说明
  9. Go 语言 Slice
  10. CCU案件例及点评:设计渐进演化的知识结构