亨元模式——池技术

转载 2015年11月18日 11:28:14


博客分类: 

设计模式之禅——亨元模式

 

一、亨元模式的定义

       亨元模式是池技术的重要实现方式;我理解的就是,在使用一个对象时,如果这个对象在内存中有,就从内存中取出使用,如果没有,就新建一个这个对象,然后存到内存中去。这样能够使用共享对象,能够有效的支持大量的细颗粒对象。

       亨元模式有两个要求:细颗粒的对象和共享对象。我们知道分配太多的对象到应用程序中将有损程序的性能,同时还容易造成内存溢出,这时就应该使用亨元模式了。最适合在缓冲池的场景了。

       其实数据库连接池等,都是一种亨元模式,在JDK中也有亨元模式,比如String类的intern()方法(最后为给出这个方法的示例)

 

二、亨元模式示例代码:

首先是抽象的亨元角色:

伦理片 http://www.dotdy.com/

Java代码  收藏代码
  1. package com.wang.flyweightPattern;  
  2.   
  3. /** 
  4.  * 抽象亨元角色 
  5.  *  
  6.  * @author wang 
  7.  *  
  8.  */  
  9. public abstract class Flyweight {  
  10.   
  11.     /* 
  12.      * 内部状态 
  13.      */  
  14.     private String intrinsic;  
  15.   
  16.     /* 
  17.      * 外部状态 
  18.      */  
  19.     protected final String extrinsic;  
  20.   
  21.     /** 
  22.      * 要求亨元角色必须接受外部状态 
  23.      *  
  24.      * @param extrinsic 
  25.      *            外部状态 
  26.      */  
  27.     public Flyweight(String extrinsic) {  
  28.         this.extrinsic = extrinsic;  
  29.     }  
  30.   
  31.     /** 
  32.      * 定义业务操作 
  33.      */  
  34.     public abstract void operate();  
  35.   
  36.     public String getIntrinsic() {  
  37.         return intrinsic;  
  38.     }  
  39.   
  40.     public void setIntrinsic(String intrinsic) {  
  41.         this.intrinsic = intrinsic;  
  42.     }  
  43.   
  44. }  

 具体的亨元角色,可以有多个,都是继承自抽象亨元角色:

Java代码  收藏代码
  1. package com.wang.flyweightPattern;  
  2.   
  3. /** 
  4.  * 具体亨元角色 
  5.  *  
  6.  * @author wang 
  7.  *  
  8.  */  
  9. public class ConcreteFlyweight1 extends Flyweight {  
  10.   
  11.     public ConcreteFlyweight1(String extrinsic) {  
  12.         super(extrinsic);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void operate() {  
  17.         System.out.println("ConcreteFlyweight1 ... operate...");  
  18.     }  
  19.   
  20. }  

 最后就是亨元的工厂:

Java代码  收藏代码
  1. package com.wang.flyweightPattern;  
  2.   
  3. import java.util.HashMap;  
  4.   
  5. /** 
  6.  * 亨元工厂 
  7.  *  
  8.  * @author wang 
  9.  *  
  10.  */  
  11. public class FlyweightFactory {  
  12.   
  13.     /* 
  14.      * 定义一个容量池 
  15.      */  
  16.     private static HashMap<String, Flyweight> pool = new HashMap<String, Flyweight>();  
  17.   
  18.     public static Flyweight getFlyweight(String extrinsic) {  
  19.           
  20.         // 需要返回的对象  
  21.         Flyweight flyweight = null;  
  22.         /* 
  23.          * 如果池中有该对象,从池中取; 
  24.          * 如果池中没有该对象,创建一个对象,并放到池中。 
  25.          */  
  26.         if( pool.containsKey(extrinsic) ){  
  27.             flyweight = pool.get(extrinsic);  
  28.         } else {  
  29.             flyweight = new ConcreteFlyweight1(extrinsic);  
  30.             pool.put(extrinsic, flyweight);  
  31.         }  
  32.         return flyweight;  
  33.     }  
  34. }  

 当我们看到最后的亨元工厂后,会不会感觉很熟悉,“着我用过啊”,对,亨元模式很常用,这就是亨元模式。

三、最后我们看看JDK中的亨元模式的一个小例子:

影音先锋电影 http://www.iskdy.com/

Java代码  收藏代码
  1. package com.wang.flyweightPattern.example;  
  2.   
  3. /** 
  4.  * String类中的亨元模式 
  5.  *  
  6.  * @author wang 
  7.  * 
  8.  */  
  9. public class StringIntern {  
  10.   
  11.     public static void main(String[] args) {  
  12.   
  13.         String str1 = "和谐";  
  14.         String str2 = "社会";  
  15.         String str3 = "和谐社会";  
  16.         String str4;  
  17.         str4 = str1 + str2;  
  18.         System.out.println(str3 == str4);  
  19.         /* 
  20.          * String类中的intern()方法, 
  21.          * 如果是String的对象池中有该类型的值, 
  22.          * 则直接返回对象池中的对象 
  23.          */  
  24.         str4 = (str1 + str2).intern();  
  25.         System.out.println(str3 == str4);  
  26.     }  
  27. }  




PHP设计模式——享元模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。         享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内...
  • jhq0113
  • jhq0113
  • 2015年05月16日 13:06
  • 1805

设计模式一日一练:亨元模式(Flyweight)

亨元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。在游戏开发中,享元模式的一个典型应用是动态生成位图字体。...
  • ynnmnm
  • ynnmnm
  • 2014年05月08日 00:12
  • 1239

IOS设计模式学习(21)享元

1 前言 在面向对象软件设计中,利用公共对象不仅能节省资源还能提高性能。共享的对象只能提供某些内在的信息,而不能用来识别对象。专门用于设计可共享对象的一种设计模式叫做享元模式(Flyweight pa...
  • u010013695
  • u010013695
  • 2013年07月04日 15:30
  • 1618

C++设计模式[十]享元模式

所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。 共享模式是支持大量细粒度对象的复用,所以享元模式要求能够共享的对...
  • langb2014
  • langb2014
  • 2015年11月11日 15:26
  • 830

JAVA设计模式之享元模式

解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象...
  • jason0539
  • jason0539
  • 2014年04月04日 07:34
  • 31564

php享元模式

CleverCode最近在看享元模式。 1 模式介绍  运用共享技术有效的支持大量细粒度的对象 2 模式中的角色   (1) 抽象享元角色:为具体享元角色规定了必须实现的方法,而外蕴状态就是以参数...
  • CleverCode
  • CleverCode
  • 2016年11月12日 16:11
  • 1304

【设计模式】亨元模式

Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对...
  • Small_Mouse0
  • Small_Mouse0
  • 2017年03月30日 21:46
  • 417

结构型模式-亨元模式

亨元模式 使用共享对象可以有效地支持大量细粒度的对象 亨元模式以共享的方式高效地支持大量的细粒度对象。亨元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(Extern...
  • hsgao_water
  • hsgao_water
  • 2015年07月24日 13:41
  • 339

亨元模式学习

在面向对象的程序设计语言看来,一切事务都被描述成对象(Object)。  对象拥有状态(属性)和行为(方法),我们将具有相同行为的对象抽象为类(Class),  类可以被看作只保留行为的对象模板,...
  • a980150976
  • a980150976
  • 2014年11月03日 15:06
  • 198

设计模式——享元模式详解

0. 前言春运买火车票是一件疯狂的事情,同一时刻会有大量的查票请求涌向服务器,服务器必须做出应答来满足我们的购票需求。试想,这些请求包含着大量的重复,比如从A地到B地的车票情况,如果每次都重复创建一个...
  • SEU_Calvin
  • SEU_Calvin
  • 2016年12月31日 16:44
  • 2556
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:亨元模式——池技术
举报原因:
原因补充:

(最多只允许输入30个字)