当前位置:   article > 正文

设计模式 -- 享元模式(Flyweight Pattern)_net设计模式实例之享元模式(flyweight pattern)

net设计模式实例之享元模式(flyweight pattern)

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

应用场景

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

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

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

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

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

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

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

  1. //棋盘
  2. class Chessboard extends MouseAdapter {
  3. WeiqiFactory wf;
  4. Graphics g;
  5. Chessboard() {
  6. wf = new WeiqiFactory();
  7. g = CenterJP.getGraphics();
  8. }
  9. public void mouseClicked(MouseEvent e) {
  10. Point pt = new Point(e.getX() - 15, e.getY() - 15);
  11. if (wz.isSelected()) {
  12. ChessPieces c1 = wf.getChessPieces("w");
  13. c1.DownPieces(g, pt);
  14. } else if (bz.isSelected()) {
  15. ChessPieces c2 = wf.getChessPieces("b");
  16. c2.DownPieces(g, pt);
  17. }
  18. }
  19. }
  20. //抽象享元角色:棋子
  21. interface ChessPieces {
  22. public void DownPieces(Graphics g, Point pt); //下子
  23. }
  24. //具体享元角色:白子
  25. class WhitePieces implements ChessPieces {
  26. public void DownPieces(Graphics g, Point pt) {
  27. g.setColor(Color.WHITE);
  28. g.fillOval(pt.x, pt.y, 30, 30);
  29. }
  30. }
  31. //具体享元角色:黑子
  32. class BlackPieces implements ChessPieces {
  33. public void DownPieces(Graphics g, Point pt) {
  34. g.setColor(Color.BLACK);
  35. g.fillOval(pt.x, pt.y, 30, 30);
  36. }
  37. }
  38. //享元工厂角色
  39. class WeiqiFactory {
  40. private ArrayList<ChessPieces> qz;
  41. public WeiqiFactory() {
  42. qz = new ArrayList<ChessPieces>();
  43. ChessPieces w = new WhitePieces();
  44. qz.add(w);
  45. ChessPieces b = new BlackPieces();
  46. qz.add(b);
  47. }
  48. public ChessPieces getChessPieces(String type) {
  49. if (type.equalsIgnoreCase("w")) {
  50. return (ChessPieces) qz.get(0);
  51. } else if (type.equalsIgnoreCase("b")) {
  52. return (ChessPieces) qz.get(1);
  53. } else {
  54. return null;
  55. }
  56. }
  57. }

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 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/600010
推荐阅读
相关标签
  

闽ICP备14008679号