当前位置: 代码迷 >> 综合 >> 设计模式 -- 享元模式(Flyweight Pattern)
  详细解决方案

设计模式 -- 享元模式(Flyweight Pattern)

热度:8   发布时间:2024-01-10 19:58:38.0

使用共享对象可以有效的支持大量的细粒度对象。

应用场景

主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。例如:缓存,对象池;Android中: Message.obtain通过重用Message对象来避免大量的Message对象被频繁的创建和销毁。

FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。

享元模式的主要角色有如下:

  • 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。

  • 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。

  • 非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。

  • 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

//棋盘
class Chessboard extends MouseAdapter {WeiqiFactory wf;Graphics g;Chessboard() {wf = new WeiqiFactory();g = CenterJP.getGraphics();}public void mouseClicked(MouseEvent e) {Point pt = new Point(e.getX() - 15, e.getY() - 15);if (wz.isSelected()) {ChessPieces c1 = wf.getChessPieces("w");c1.DownPieces(g, pt);} else if (bz.isSelected()) {ChessPieces c2 = wf.getChessPieces("b");c2.DownPieces(g, pt);}}
}//抽象享元角色:棋子
interface ChessPieces {public void DownPieces(Graphics g, Point pt);    //下子
}//具体享元角色:白子
class WhitePieces implements ChessPieces {public void DownPieces(Graphics g, Point pt) {g.setColor(Color.WHITE);g.fillOval(pt.x, pt.y, 30, 30);}
}//具体享元角色:黑子
class BlackPieces implements ChessPieces {public void DownPieces(Graphics g, Point pt) {g.setColor(Color.BLACK);g.fillOval(pt.x, pt.y, 30, 30);}
}//享元工厂角色
class WeiqiFactory {private ArrayList<ChessPieces> qz;public WeiqiFactory() {qz = new ArrayList<ChessPieces>();ChessPieces w = new WhitePieces();qz.add(w);ChessPieces b = new BlackPieces();qz.add(b);}public ChessPieces getChessPieces(String type) {if (type.equalsIgnoreCase("w")) {return (ChessPieces) qz.get(0);} else if (type.equalsIgnoreCase("b")) {return (ChessPieces) qz.get(1);} else {return null;}}
}

Android中SQLiteCompiledSql的使用,其实是很多数据库系统典型的实现。从应用启动,通过各种数据库操作,我们不知道进行了多少次的查询操作,而这些操作中又有相当一部分sql语句是相同的,这些编译后的sql编译对象其实是一样的,是可以共用共享的,其实就是缓存。SQLiteCompiledSql就是这样的一个需要共享的享元对象。其中SqliteDatabase中的mCompiledQuerie就是存放享元对象的容器。通过这种方式大大减少了sql编译对象的创建,提高了数据库操作的性能。


根据以下文章总结:

  1. Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/ 

  2. 3种设计模式详解 https://www.iteye.com/blog/zz563143188-1847029 

  3. Android系统编程思想:设计模式https://github.com/sucese/android-open-source-project-analysis/blob/master/doc/Android%E7%B3%BB%E7%BB%9F%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E7%AF%87/02Android%E7%B3%BB%E7%BB%9F%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E7%AF%87%EF%BC%9A%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#35-%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F

  4. 设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html

  5. java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html

  6. 设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html 

  7. 设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html

  8. Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html

  9. Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html 

  相关解决方案