设计模式之flyweight享元模式
运用共享技术支持大量细粒度对象的使用
Flyweight模式(享元)
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
设计模式之flyweight享元模式的更多相关文章
- 面向对象设计模式之Flyweight享元模式(结构型)
动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...
- 设计模式(11)--Flyweight(享元模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...
- Java设计模式:Flyweight(享元)模式
概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...
- go语言设计模式之Flyweight(享元模式)
flyweight.go package flyweight import ( "time" ) const ( TEAM_A = "A" TEAB_B = & ...
- 设计模式11: Flyweight 享元模式(结构型模式)
Flyweight 享元模式(结构型模式) 面向对象的代价 面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能.但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系 ...
- C++设计模式-Flyweight享元模式
Flyweight享元模式 作用:运用共享技术有效地支持大量细粒度的对象. 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intrins ...
- 20、FlyWeight 享元模式
池化的思想 1.Flyweight享元模式 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用.由于享元模式要求能够共享的对象必 ...
- Java设计模式之《享元模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...
- Flyweight享元模式(结构型模式)
1.面向对象的缺点 虽然OOP能很好的解决系统抽象的问题,并且在大多数的情况下,也不会损失系统的性能.但是在某些特殊的业务下,由于对象的数量太多,采用面向对象会给系统带来难以承受的内存开销.示例代码如 ...
随机推荐
- c# 导入导出excel表格式
c#使用代码导入excel时,当遇到纯数字且大于15位时会出现编码混乱(表现为科学计数法),要想呈现与excel表中纯数字格式和在数据库中呈现纯数字,操作如下: 完成即可. 导出取决于导入的内容排版.
- leetcode342
public class Solution { public bool IsPowerOfFour(int num) { ) && ((num & (num - )) == ) ...
- node 把前台传来的base64码转成图片存放
最近做个人网站头像修改用到了,在做头像修改,先做了一个图片切割,只需要上传你选中部分, 如图 这种需求 应该还是会遇到的, http://pan.baidu.com/s/1boVkn1t 这是裁剪图片 ...
- 机器学习入门-混淆矩阵-准确度-召回率-F1score 1.itertools.product 2. confusion_matrix(test_y, pred_y)
1. itertools.product 进行数据的多种组合 intertools.product(range(0, 1), range(0, 1)) 组合的情况[0, 0], [0, 1], [ ...
- java 观察者模式 与spring配置
一.Observer模式的意图: 在对象的内部状态发生变化时,自动通知外部对象进行响应. 二.Observer模式的构成: ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象 ·观察者:需要对 ...
- C++17尝鲜:类模板中的模板参数自动推导
模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...
- Javaweb连接数据库
在JSP中使用JDBC驱动连接mysql数据库. 1: 下载mysql的Java连接程序 2: 解压目录下的mysql-connector-java-5.0.24-bin.jar文件就是连接MySql ...
- sql查询job
use msdb go --if object_id('tempdb..#SqlAgentJob') is not null -- drop table #SqlAgentJob --go decla ...
- HTML转义
HTML转义 模板对上下文传递的字符串进行输出时,会对以下字符自动转义 小于号< 转换为< 大于号> 转换为> 单引号' 转换为' 双引号" 转换为 " 与 ...
- conductor FAQ
在一段时间后(如1小时,1天等),您如何安排将任务放入队列中? 轮询任务后,更新任务的状态IN_PROGRESS并将其callbackAfterSeconds设置为所需的时间.任务将保留在队列中,直到 ...