• Structual设计--Flyweight模式


    1.意图

    运用共享技术有效地支持大量细粒度的对象。

    2.别名

    3.动机

    有些应用程序得意于在其整个设计过程中採用对象技术,但简单化的实现代价极大。如我们在使用word的时候。假设设置正文字体为:text.setFont(new Font(“細明體”, Style.BOLD, 12));每一个文字我们都须要这样设置,内存太大。并且也非常难记,稍有不注意就会出错。所以通常并非对每一个字符都用一个单独的对象去表示。

    Flyweight模式描写叙述了怎样共享对象。是的能够细粒度地使用他们而无需高昂的代价。

    4.适用性

    Flyweight模式的有效性非常大程度上取决于怎样使用它以及在何处使用它。当下面情况都成立时使用Flyweight模式:

    • 一个应用程序使用了大量的对象
    • 全然因为大量的对象,造成非常大的存储开销
    • 对象的大多数状态都可变为外部状态。
    • 假设删除对象的外部状态,那么能够用相对较少的共享对象代替非常多组对象。
    • 应用程序不依赖于对象标识。因为Flyweight对象能够被共享,对于概念上明显有别的对象,标识測试将返回真值。

    5.结构

    享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候能够降低内存的开销。通常与工厂模式一起使用。


    Flyweight模式
    FlyWeightFactory负责创建和管理享元单元,当一个client请求时。工厂须要检查当前对象池中是否有符合条件的对象,假设有。就返回已经存在的对象。假设没有,则创建一个新对象,FlyWeight是超类。

    一提到共享池,我们非常easy联想到Java里面的JDBC连接池,想想每一个连接的特点。我们不难总结出:适用于作共享的一些个对象。他们有一些共同拥有的属性,就拿数据库连接池来说。url、driverClassName、username、password及dbname。这些属性对于每一个连接来说都是一样的。所以就适合用享元模式来处理,建一个工厂类,将上述相似属性作为内部数据,其他的作为外部数据。在方法调用时,当做參数传进来,这样就节省了空间。降低了实例的数量。
    看个样例:
    数据库共享池

    6.代码演示样例

    看下数据库连接池的代码:

    public class ConnectionPool {
    
        private Vector<Connection> pool;
    
        /*公有属性*/
        private String url = "jdbc:mysql://localhost:3306/test";
        private String username = "root";
        private String password = "root";
        private String driverClassName = "com.mysql.jdbc.Driver";
    
        private int poolSize = 100;
        private static ConnectionPool instance = null;
        Connection conn = null;
    
        /*构造方法。做一些初始化工作*/
        private ConnectionPool() {
            pool = new Vector<Connection>(poolSize);
    
            for (int i = 0; i < poolSize; i++) {
                try {
                    Class.forName(driverClassName);
                    conn = DriverManager.getConnection(url, username, password);
                    pool.add(conn);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /* 返回连接到连接池 */
        public synchronized void release() {
            pool.add(conn);
        }
    
        /* 返回连接池中的一个数据库连接 */
        public synchronized Connection getConnection() {
            if (pool.size() > 0) {
                Connection conn = pool.get(0);
                pool.remove(conn);
                return conn;
            } else {
                return null;
            }
        }
    }
    

    通过连接池的管理。实现了数据库连接的共享,不须要每一次都又一次创建连接,节省了数据库又一次创建的开销。提升了系统的性能。

    7.相关模式

    • Flyweight模式通常和Composite模式结合起来。用共享叶结点的有向无环图实现一个逻辑上的层次结构。

    • 通常。最好用Flyweight实现State和Strategy对象。

    引用:

    http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
    http://item.jd.com/10057319.html
    http://blog.csdn.net/zhangerqing/article/details/8239539

  • 相关阅读:
    自主学习1
    动手动脑10.28
    《程序员修炼之道》阅读笔记三
    《程序员修炼之道》阅读笔记
    11月20,21,22训练赛
    Rabbits(跳兔子)
    01背包变式(并查集+dp01背包)
    问题 I: 约会序列(两边枚举)
    问题 J: 直角三角形
    Cow Exhibition (01背包的负数处理)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5282363.html
Copyright © 2020-2023  润新知