java设计模式---享元模式
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设计模式---享元模式相关推荐
- 【设计模式】Java设计模式 - 享元模式
[设计模式]Java设计模式 - 享元模式
- JAVA 设计模式 享元模式
用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...
- JAVA设计模式--享元模式
目录 一.什么是享元模式 二.享元模式在Java中的典型应用 三.享元模式的结构 单纯享元模式 复合享元模式 四.享元模式应用举例 五.享元模式的适用性 六.享元模式的特点 七.总结 一.什么是享元模 ...
- Java设计模式----------享元模式
1.介绍 享元模式通过尽可能的复用已经存在的对象,从而尽量少的创建新对象,以节约系统的内存和提供系统性能.在享元模式中,对象的属性分为两种,内部状态和外部状态.内部状态指的是对象中不随外部变化的属性, ...
- Python设计模式-享元模式
Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...
- 10-Python与设计模式--享元模式
10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...
- 设计模式--享元模式实现C++
/********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...
- Unity设计模式——享元模式(附代码)
Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...
- 第二十二章 Caché 设计模式 享元模式
文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...
最新文章
- latex中插入代码
- javascript:函数的apply,call方法和length属性
- python实现点到平面的距离
- 软件设计原则(七)合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
- 前端学习(1768):前端调试值之内存监控的原理和方法三
- 深度学习最常用的学习算法:Adam优化算法
- jeecg3.8popup弹出窗口触发失去焦点事件,引发验证弹窗,影响体验问题的解决办法
- Spring-tx-TransactionStatus接口(savepoint)
- Android开发环境搭建-eclipse+ADT及hello world
- linux下分析prn文件,linux专题一之文件描述符、重定向、管道符、tee命令
- 方差公式Var(x)=E(x^2)-[E(x)]^2,求期望值
- 华为虚拟化usb服务器,华为FusionComputer服务器虚拟化完美解决方案
- RESTful API入门学习笔记
- 转载: 找不到MSVCR90.dll、Debug vs Release及cppLapack相关
- 移动公网5G配置(一)
- AI实战:文本自动摘要简述
- EduCoder_web实训作业--JavaScript学习手册四:JS对象
- PixiJS学习(10)事件机制
- CSS中那些px、em、pt、rem、%、dp(android)单位
- 感觉 C++ 很简单,但为何这么多劝退的?
热门文章
- YYDispatchQueuePool 学习笔记
- 觉得酒驾处罚太严厉?看看国外的再说吧...
- ASI和AFN的区别
- 看一个穷人怎样拥有多套房产的?-财富可以这样成长
- 关于一些朋友想做在线教育的回复和分享
- 使用PHP处理POST上传时$_FILES数组为何为空
- Android Navigation Drawer(导航抽屉)
- 【推荐】ZendStudio 5.5.1 开发调试(Debug)配置说明
- Go 语言 Slice
- CCU案件例及点评:设计渐进演化的知识结构