`

享元模式

阅读更多

享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。

单纯享元模式所涉及到的角色如下:
  ●  抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。
  ●  具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。
  ●  享元工厂(FlyweightFactory)角色 :本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。


 

享元模式由于其共享特性,可以使用在任何池化的操作中,如线程池、数据库连接池等。数据库连接池是享元模式的一个典型应用。在该应用中,需要一个连接池工厂类ConnectPool,它是多个连接Connection的聚集,其结构如图12-26所示。

 

连接池工厂类ConnectPool具有一个数据集合对象pool,它在构造函数中进行初始化。该类提供了一个单例的工厂类,以防止重复创建该工厂实例,并提供取得连接getConnection()和释放连接freeConnection()函数来分别从共享池中取得和释放一个连接。

其源代码如程序12-47所示。

程序12-47  连接池实例ConnectionPool.java

  1. package structure.flyweight;  
  2.  
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5. import java.util.Vector;  
  6.  
  7. /**  
  8.  * @author liuzhongbing  
  9.  * 享元模式-连接池实例  
  10.  */ 
  11. public class ConnectionPool {  
  12.  
  13.     private Vector<Connection> pool;  
  14.  
  15.     private String url = "jdbc:mysql://localhost:3306/test";  
  16.     private String username = "root";  
  17.     private String password = "";  
  18.     private String driverClassName = "com.mysql.jdbc.Driver";  
  19.  
  20.     /**  
  21.      * 连接池的大小,也就是连接池中有多少个数据库连接  
  22.      */ 
  23.     private int poolSize = 100;  
  24.  
  25.     private static ConnectionPool instance = null;  
  26.  
  27.     /**  
  28.      * 私有的构造方法,禁止外部创建本类的对象,要想获得本类的对象,  
  29.      通过<code>getIstance</code>方法  
  30.      * 使用了设计模式中的单子模式  
  31.      */ 
  32.     private ConnectionPool() {  
  33.         pool = new Vector<Connection>(poolSize);  
  34.         // 在连接池中创建初始设置的数据库连接  
  35.         Connection conn = null;  
  36.         for (int i = 0; i < poolSize; i++) {  
  37.             try {  
  38.                 Class.forName(driverClassName);  
  39.                 conn = java.sql.DriverManager.getConnection(url, 
  40. username, password);  
  41.                 pool.add(conn);  
  42.             } catch (ClassNotFoundException e) {  
  43.                 e.printStackTrace();  
  44.             } catch (SQLException e) {  
  45.                 e.printStackTrace();  
  46.             }  
  47.  
  48.         }  
  49.     }  
  50.       
  51.     /**  
  52.      * 返回连接到连接池中  
  53.      */ 
  54.     public synchronized void release(Connection conn) {  
  55.         pool.add(conn);  
  56.     }  
  57.  
  58.     /**  
  59.      * 关闭连接池中的所有数据库连接  
  60.      */ 
  61.     public synchronized void closePool() {  
  62.         for (int i = 0; i < pool.size(); i++) {  
  63.             try {  
  64.                 ((Connection) pool.get(i)).close();  
  65.             } catch (SQLException e) {  
  66.                 e.printStackTrace();  
  67.             }  
  68.             pool.remove(i);  
  69.         }  
  70.     }  
  71.  
  72.     /**  
  73.      * 返回当前连接池的一个对象  
  74.      */ 
  75.     public static ConnectionPool getInstance() {  
  76.         if (instance == null) {  
  77.             instance = new ConnectionPool();  
  78.         }  
  79.         return instance;  
  80.     }  
  81.  
  82.     /**  
  83.      * 返回连接池中的一个数据库连接  
  84.      */ 
  85.     public synchronized Connection getConnection() {   
  86.         if (pool.size() > 0) {  
  87.             Connection conn = pool.get(0);  
  88.             pool.remove(conn);  
  89.             return conn;  
  90.         } else {  
  91.             return null;  
  92.         }  
  93.     }  

要使用该连接池,只需要创建一个连接池的实例pool,然后使用getConnection()来取得一个连接执行SQL查询,最后使用freeConnection()来释放连接即可。其源代码如程序12-48所示。

程序12-48  连接池测试类ConnectionPoolTest.java

  1. package structure.flyweight;  
  2.  
  3. import java.sql.Connection;  
  4. import java.sql.ResultSet;  
  5. import java.sql.Statement;  
  6.  
  7. public class ConnectionPoolTest {  
  8.  
  9.     public static void main(String[] args) throws Exception {  
  10.         String sql = "select id,name,phone from guestmessage";  
  11.         ConnectionPool pool = ConnectionPool.getInstance();  
  12.         for (int i = 0; i < 100; i++) {  
  13.             Connection conn = pool.getConnection();  
  14.             Statement stmt = conn.createStatement();  
  15.             ResultSet rs = stmt.executeQuery(sql);  
  16.             while (rs.next()) {  
  17.             }  
  18.             rs.close();  
  19.             stmt.close();  
  20.             pool.release(conn);  
  21.         }  
  22.         pool.closePool();  
  23.     }  

通过以上连接池的管理,实现了数据库连接的共享,不需要每一次取得连接时都重新创建,因为节省了重复创建数据库连接的开销,使得程序的性能大幅提升。

分享到:
评论

相关推荐

    设计模式的享元模式的例子

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...

    软件设计模式——享元模式设计报告

    享元模式是一种软件设计模式,它的主要目的是为了提高性能,减少对象的创建,尤其是在大量相似对象需要被创建的情况下。在给定的咖啡店案例中,享元模式的应用可以帮助优化内存使用,避免为每杯咖啡的配料表分配独立...

    享元模式,内含可运行代码和解释

    享元模式是一种经典的设计模式,属于结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在许多场景下,特别是计算机编程中,我们可能会遇到大量的相似对象,比如在图形...

    设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在处理大量对象时。在享元模式中,通过共享技术来有效支持大量细粒度的对象,从而减少内存消耗。《设计模式之禅》这本书是设计模式...

    享元模式代码示例

    享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低内存占用的目的。在面向对象编程中,当系统需要创建大量相似对象时,享元模式能够有效地提升性能,因为大部分对象是重复的,...

    享元模式Demo

    享元模式是一种优化资源使用的软件设计模式,尤其适用于对象创建成本较高或系统内存有限的情况。在计算机科学中,特别是编程领域,享元模式通过共享大量相似对象来减少内存占用,提高程序性能。它通过将对象的状态...

    设计模式学习笔记--Flyweight享元模式.docx

    享元模式是一种设计模式,属于构造型模式,其主要目的是减少对象的数量,通过共享大量相似对象的内部状态来节省内存。这种模式在处理大量细粒度对象时特别有用,能够有效地提高系统的性能。 享元模式的核心是...

    总结JavaScript设计模式编程中的享元模式使用

    享元模式是软件工程中一种用于优化性能的设计模式,它通过共享相似对象的实例来减少内存使用或者计算的开销。在JavaScript编程中,尤其是处理DOM操作和大量相似对象时,享元模式的使用尤为关键。 享元模式的主要...

    Android享元模式Demo

    享元模式是一种优化资源利用、减少对象创建的设计模式,它在Android开发中也有着广泛的应用。在这个"Android享元模式Demo"中,我们将探讨如何在Android环境中实现享元模式,并通过具体的实例来理解其工作原理。 享...

    设计模式-享元模式(讲解及其实现代码)

    享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低系统内存占用、提高性能的目的。在软件工程中,当系统中存在大量相似或重复的对象时,享元模式尤为适用。 享元模式的核心是...

    Java设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在Java中,享元模式常用于处理大量相似对象的场景,例如在图形界面中绘制大量相似的...

    第15章_享元模式.ppt

    在享元模式中可以共享的相同内容称为内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同...

    享元模式代码+文档

    享元模式是一种结构型设计模式,它通过共享已有对象来减少系统中对象的数量,从而达到降低内存占用的目的。在软件工程中,当一个系统需要处理大量相似对象时,享元模式能够有效地提升性能,尤其在处理轻量级对象时...

    享元模式flyweight

    享元模式(Flyweight Pattern)是一种结构型设计模式,它能有效地减少系统中对象的数量,从而降低内存消耗,提高性能。这种模式通过共享大量相似对象的内部状态来达到这一目标,而只保留对象的外部状态在外部管理。...

    设计模式(C#)之享元模式(Flyweight Pattern)

    享元模式是设计模式中的一种结构型模式,它主要通过共享已有对象来减少内存中对象的数量,从而提高系统性能。在C#编程中,享元模式尤其适用于那些创建大量相似对象且内存消耗较大的场景。本篇文章将深入探讨享元模式...

    享元模式的分析以及实际应用.docx

    享元模式是一种优化资源利用的设计模式,主要用于减少创建和管理对象的数量,以达到节省内存的目的。在软件工程中,尤其是在处理大量相似对象时,享元模式能够显著提高系统的性能。享元模式通过共享那些可以共享的...

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)

    享元模式是面向对象设计中的一种结构型模式,它的主要目的是通过共享大量相似对象来减少内存的使用,提高系统的性能。在C#编程语言中,我们可以利用享元模式来优化那些具有大量实例但大部分状态可以共享的对象。在这...

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 /** * 享元模式(预加载单例) * “元” 理解为 “同一地址对象” * 运用共享技术,减少对象的创建,降低对象的数量,降低内存消耗,提高性能 * ...

    享元模式1

    享元模式 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少大量相似对象的创建,降低系统资源的开销和内存压力。该模式通过共享已经存在的对象来大幅减少需要创建的对象数量,避免创建大量相似类带来...

Global site tag (gtag.js) - Google Analytics