赞
踩
使用共享对象可以有效的支持大量的细粒度对象。
应用场景
主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。例如:缓存,对象池;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编译对象的创建,提高了数据库操作的性能。
根据以下文章总结:
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/
设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html
java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html
设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html
设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。