- 浏览: 1776441 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
轻量级设计模式是通过共享对象来减少内存负载,它通过把对象属性分离成内部和外部两种来实现对资源的共享。
GoF(Gang of Four)说:“运用共享技术高效的支持大量细粒度对象 ”。轻量级模式的核心就是“共享 ”。
何时使用轻量级设计模式,可以参照下面几个因素:
- 需要创建大量对象。
- 考虑内存成本。
- 大多数对象属性可以对外共享。
- 应用程序不必授权给唯一的对象,因为同一对象被实例后需要被重复使用。
- 外在状态可以被计算而不是存储,这样更好(下面解释)。
现在,一台电脑内存平均都有5O0GB硬盘和4GB RAM,这是不是意味着我们不需要去考虑内存和成本了呢?由于成本下降让我们使用起来没有了限制,移动设备每天都在增加,而它们仍然存在内存约束。假设你 创建一个宇宙地图项目,你需要给每个星星创建对象,你想想,这个需要多少内存,GoF 在他们的书里给了一个例子。如果在每一个文件里面都需要为每个角色创建对象,想象一下文件将会多大,还何谈性能?
如何应用轻量级
在使用轻量级之前,应该先解析大对象类型,核心思路是通过重用 减少对象的创建。创建一小群能够通过分享重用的对象。细致分析每个对象属性,它们可以被分离成内在和外在两种。通过上下文来进行共享。让我们来看一个例子。
假设在一个文本编辑器中只能输入A到Z这26个字母,如果我们要使用这个编辑创建100页文档,我可能会有200000(2000*100)个字符 (假设2000字节/页)。如果没有轻量级,我们将会创建200000个对象去进行细粒度控制。每个字符也会有它们自己的属性,比如颜色、字体、尺寸等 等,这里我们该如何应用轻量级呢?
内部和外部状态
创建26个对象(从A到Z)映射每个单独的字符。这些26个字符将会有它们字节的内部状态特征,比如说对象‘a’将会有“a”字符的特征。那颜色、 字体、大小这些该怎么处理呢?这些外在状态将通过客户端代码创建。存储26个对象,通过客户端代码获得所需的字符/对象特征,并且通过外在状态进行上下联 系。关于上下文意味着,字符‘a’在第一行可能是红色而在其他行可能是蓝色。
实现轻量级
对象的内部状态被称为轻量级对象。当实现轻量级时,我们将会创建一些具体的对象并且会存储一些内在特征。我们将会有一个工厂去创建这些具体对象,而这个工厂就称作轻量级工厂 。这个工厂的作用是保证这些对象可以进行共享并且不会被重复创建。
让我们来看一个例子吧。我们要画多种不同的几何图形,比如矩形、椭圆形,每个图形可能会使用不同的颜色,尺寸,填充类型,字体。为了方便实现,我们将图形限制成矩形和椭圆形两种,每个图形都会有一个标签与它们的形状相映射。矩形标签为“R”,椭圆形标签为“O”。
使用内部状态作为唯一的标签。因此我们将会有两个轻量级对象。颜色、尺寸、填充类型、字体这些作为外部状态。我们将会使用一个轻量级工厂来维护这两个对象,并且会把它们相应地的分发到客户端。这里有一个接口用来实现轻量级并且会有相同的设计图。
为了使用方便,客户端代码将使用random产生器来创建外在属性。我们将会动态计算和使用这些不被存储的外在属性。
轻量级模式的UML图
轻量级模式的Java实现
- package com.javapapers.designpattern.flyweight;
- import java.awt.Color;
- import java.awt.Graphics;
- public interface MyShape {
- public void draw(Graphics g, int x, int y, int width, int height,
- Color color, boolean fill, String font);
- }
- package com.javapapers.designpattern.flyweight;
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- public class MyOval implements MyShape {
- private String label;
- public MyOval(String label) {
- this .label = label;
- }
- public void draw(Graphics oval, int x, int y, int width, int height,
- Color color, boolean fill, String font) {
- oval.setColor(color);
- oval.drawOval(x, y, width, height);
- oval.setFont( new Font(font, 12 , 12 ));
- oval.drawString(label, x + (width / 2 ), y);
- if (fill)
- oval.fillOval(x, y, width, height);
- }
- }
- package com.javapapers.designpattern.flyweight;
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- public class MyRectangle implements MyShape {
- private String label;
- public MyRectangle(String label) {
- this .label = label;
- }
- public void draw(Graphics rectangle, int x, int y, int width, int height,
- Color color, boolean fill, String font) {
- rectangle.setColor(color);
- rectangle.drawRect(x, y, width, height);
- rectangle.setFont( new Font(font, 12 , 12 ));
- rectangle.drawString(label, x + (width / 2 ), y);
- if (fill)
- rectangle.fillRect(x, y, width, height);
- }
- }
- package com.javapapers.designpattern.flyweight;
- import java.util.HashMap;
- public class ShapeFactory {
- private static final HashMap shapes = new HashMap();
- public static MyShape getShape(String label) {
- MyShape concreteShape = (MyShape) shapes.get(label);
- if (concreteShape == null ) {
- if (label.equals( "R" )) {
- concreteShape = new MyRectangle(label);
- } else if (label.equals( "O" )) {
- concreteShape = new MyOval(label);
- }
- shapes.put(label, concreteShape);
- }
- return concreteShape;
- }
- }
- package com.javapapers.designpattern.flyweight;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Container;
- import java.awt.Graphics;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- public class Client extends JFrame {
- private static final int WIDTH = 400 ;
- private static final int HEIGHT = 400 ;
- private static final String shapes[] = { "R" , "O" };
- private static final Color colors[] = { Color.red, Color.green, Color.blue };
- private static final boolean fill[] = { true , false };
- private static final String font[] = { "Arial" , "Courier" };
- public Client() {
- Container contentPane = getContentPane();
- JButton startButton = new JButton( "Draw Shapes" );
- final JPanel panel = new JPanel();
- contentPane.add(panel, BorderLayout.CENTER);
- contentPane.add(startButton, BorderLayout.SOUTH);
- setSize(WIDTH, WIDTH);
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setVisible( true );
- startButton.addActionListener( new ActionListener() {
- public void actionPerformed(ActionEvent event) {
- Graphics g = panel.getGraphics();
- for ( int i = 0 ; i < 100 ; ++i) {
- MyShape shape = ShapeFactory.getShape(getRandomShape());
- shape.draw(g, getRandomX(), getRandomY(), getRandomWidth(),
- getRandomHeight(), getRandomColor(),
- getRandomFill(), getRandomFont());
- }
- }
- });
- }
- private String getRandomShape() {
- return shapes[( int ) (Math.random() * shapes.length)];
- }
- private int getRandomX() {
- return ( int ) (Math.random() * WIDTH);
- }
- private int getRandomY() {
- return ( int ) (Math.random() * HEIGHT);
- }
- private int getRandomWidth() {
- return ( int ) (Math.random() * (WIDTH / 7 ));
- }
- private int getRandomHeight() {
- return ( int ) (Math.random() * (HEIGHT / 7 ));
- }
- private Color getRandomColor() {
- return colors[( int ) (Math.random() * colors.length)];
- }
- private boolean getRandomFill() {
- return fill[( int ) (Math.random() * fill.length)];
- }
- private String getRandomFont() {
- return font[( int ) (Math.random() * font.length)];
- }
- public static void main(String[] args) {
- Client client = new Client();
- }
- }
- Flyweight.zip (9.5 KB)
- 下载次数: 1
发表评论
-
RESTful API 编写指南
2016-06-14 11:12 5175基于一些不错的RESTful ... -
谈冷热数据
2015-07-20 11:13 6153http://jishu.zol.com.cn/11379. ... -
贺岁文:部门正副经理之争
2015-01-29 11:57 1175http://blog.csdn.net/shenyisyn ... -
只能通过chrome网上应用商店安装该程序”的解决方法
2014-10-09 13:09 6139自 Chrome 21.x 开始默认只允许从 Chrome ... -
nginx同一iP多域名配置方法
2014-06-03 13:48 2685nginx绑定多个域名可又把多个域名规则写一个配置文件里,也 ... -
风车网陈晓峰回忆录:我的两个月倒闭史
2014-05-27 16:09 1334http://tech2ipo.com/54719 ... -
Debugging and Profiling PHP with Xdebug
2014-04-15 12:10 1731http://www.sitepoint.com/debug ... -
XHProf 中文文档
2014-04-15 11:26 1455XHProf文件(草稿) 翻译:徐 ... -
让普通用户登录phpmyadmin不显示information_schema
2014-02-13 16:54 1909http://www.cnblogs.com/faily20 ... -
apache2.2+svn1.6+TortoiseSVN在windows环境搭建
2013-12-21 21:58 4462今天空闲时间对SVN服务器端和客户端环境做了搭建,并且成功了 ... -
MiniCMS - 吐槽
2013-10-22 10:58 1438看到的深有感触, ... -
MySQL 数据库通过日志恢复
2013-08-14 17:09 1083http://blog.csdn.net/hanxin198 ... -
使用文件函数操作Memcache
2013-08-12 18:21 1518写道 最近一周,SAE又悄悄的上线了一个新功能.那就是开始 ... -
转 总结过去10年
2013-08-10 11:17 1117下面的好文 担心原作者删帖 转到此处吧 http:/ ... -
SAET SQL_CALC_FOUND_ROWS 问题
2013-07-20 14:22 2301上午遇到 应用数据查不到的问题,但是 数据库中明明 ... -
问一下使用struts的同学们,你们这些年,是怎么过来的?
2013-07-20 12:04 1364by 空虚浪子心 http://www.inbreak.ne ... -
杂谈产品灰度上线的研发模式
2013-05-13 13:45 1753写道 传统的产品研发 ... -
正则表达式口诀
2013-04-12 14:38 1458写道 来源:蓝血正则 ... -
Emacs 快速指南
2013-04-09 17:51 2323您正在阅读 Emacs 快速指南(Emacs tutorial ... -
推荐几个技术博客,持续更新中...
2013-03-18 10:07 3300推荐几个技术博客,我整理了一下googlereader的订 ...
相关推荐
AJAXPro是一个基于.NET的轻量级Ajax组件,尽管它发布的时间较早,但它的设计理念和实现方法对当前开发者仍然具有一定的参考价值。下面我们就来详细探讨一下AJAXPro的使用以及一些重要的知识点。 ### 1. AjaxPro的...
微信小程序,作为一种轻量级的应用程序,是基于微信平台的生态系统而生,无需下载安装,通过扫描二维码或搜索名称即可使用。它的出现极大地优化了用户的手机内存使用,提升了移动互联网应用的交互体验。本文通过分析...
Swing组件都是轻量级的,它们运行在Java虚拟机上,因此具有跨平台的特性。 二、容器与布局管理器 在Swing中,组件通常放置在容器(Container)内,容器可以包含其他组件或容器。JFrame是Swing中最常见的顶级容器,...
编写控制器时,要保持其轻量级,避免过多的业务逻辑;在视图层,应避免包含复杂的计算,保持视图的纯粹性。 总结:MVC模式是Web开发中的一个重要工具,它有助于构建可扩展、可维护的Web应用程序。PHP5及以上的版本...
JFinal 是一个基于Java语言的轻量级Web开发框架,其设计目标是简化开发、提高效率,让开发者能够更专注于业务逻辑的实现。本篇文档将对JFinal的技术架构进行浅析,帮助读者理解其核心设计理念和工作原理。 1. **...
轻客户端模式指用户只需一个轻量级的终端设备,就可以通过云服务获取企业提供的各种应用服务。 此外,文章提到的“电子外色”思想,可能是指通过信息技术手段拓展电子商务的模式,利用云计算技术,使得电子商务的...
WSO2 Synapse 是一款轻量级的开源ESB,特别适合处理Web服务相关的任务。 **发展趋势** - **轻量化**:专注于Web服务,保持轻量级的特点。 - **API管理**:加强对API的管理和安全控制。 - **社区支持**:增加社区...
微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要针对移动设备用户,特别是智能手机用户。它无需下载安装即可使用,极大地提升了用户的使用便利性。这篇“基于微信小程序的应用开发浅析”可能会涵盖以下...
UDP是TCP/IP协议族中的一个无连接、不可靠的传输协议,不保证数据包的顺序或完整性,但因为其轻量级和快速的特性,在局域网环境和对实时性要求高的应用中较为适用。在LabVIEW中,可以通过编程实现基于UDP的网络通信...
Swing组件通常是轻量级的组件,这意味着它们不是原生组件,但它们在外观和行为上模仿了原生组件。Swing使用模型-视图-控制器(MVC)设计模式,其中模型代表数据,视图负责展示数据,控制器处理用户输入。 在构造...
未来的研究所可能涉及的方向包括改进网络结构以提高计数精度,开发轻量级模型以适应实时应用,以及利用元学习或迁移学习提升模型在未见过的场景中的表现。 总结来说,基于深度学习的图像人群计数方法通过自动化特征...
这种技术的核心在于利用经过处理的轻量化BIM模型,通过机器人全站仪在施工现场进行快速、精确的点位定位,极大地提升了施工效率和精度。 BIM技术在建筑业的广泛应用,使得项目管理更加集成化和自动化。它可以创建...
微信小程序,作为腾讯推出的一种轻量级应用形态,它无需下载安装即可使用,极大地降低了用户的使用门槛,同时也为企业和开发者提供了更广阔的服务空间。微信小程序的崛起,背后揭示的是互联网下半场对于场景化服务的...
Autofac是一款基于.NET的轻量级、高性能的依赖注入容器,它实现了控制反转(Inversion of Control,IoC)原则,帮助开发者在运行时动态地组合和管理对象及其依赖关系。 Autofac的特点: 1. 轻量级:相比于其他如...
然而,由于其复杂的架构和较高的学习曲线,EJB在轻量级和敏捷开发环境中可能显得过于庞大。 总结来说,Java Bean更适合于简单的、局部的业务逻辑实现,而EJB则适用于构建复杂的、分布式的、需要强大服务支持的企业...