GOF23之享元模式

一、核心作用:

以共享的方式高效的支持了大量细粒度对象的重用
享元对象可以做到共享的关键是区分了内部状态和外部状态

  1. 内部状态:可以共享,不会随环境变化而改变
  2. 外部状态:不可以共享,会随着环境变化而改变

二、常见应用场景:

可以在任何“池”中操作
线程池、数据库连接池

三、享元模式的实现:

FlyWeightFactory 享元工厂类:创建并管理享元对象,享元池一般设计成键值对
FlyWeight抽象享元类:通常是一个接口或者抽象类,声明公共方法,这些方法可以像外界提供对象的内部状态,设置外部状态
ConcreteFlyWeight具体享元类:为内部状态提供成员变量,进行存储
UnsharedConcreteFlyWeight 非共享享元类:不能被共享的子类可以设计为非共享享元类

四、代码示例:

在这里插入图片描述

一、抽象享元类:
package com.hezeu.flyweight;

/**
* @Classname FlyWeight
* @Description 抽象享元类
* @Date 2020/2/23 下午 10:36
* @Created by 朱进博 [email protected]
*/
public interface ChessFlyWeight {
        void setColor(String color);
        String getColor();
        void display(UnsharedConcreteFlyWeight u);
}

二、具体享元类:
//具体享元类
class ConcreteChessFlyWeight implements ChessFlyWeight{
        private String color;

        public ConcreteChessFlyWeight(String color) {
                this.color = color;
        }

        @Override
        public void setColor(String color) {
                this.color = color;
        }

        @Override
        public String getColor() {
                return color;
        }

        @Override
        public void display(UnsharedConcreteFlyWeight u) {
                System.out.println("棋子颜色"+color);
                System.out.println("棋子位置"+u.getX()+"-----"+u.getY());

        }
}
三、非共享享元类:
package com.hezeu.flyweight;

/**
* @Classname UnsharedConcreteFlyWeight
* @Description 非共享享元类
* @Date 2020/2/23 下午 11:05
* @Created by 朱进博 [email protected]
*/
public class UnsharedConcreteFlyWeight {
        private int x,y;

        public UnsharedConcreteFlyWeight(int x, int y) {
                this.x = x;
                this.y = y;
        }

        public int getX() {
                return x;
        }

        public void setX(int x) {
                this.x = x;
        }

        public int getY() {
                return y;
        }

        public void setY(int y) {
                this.y = y;
        }
}
四、享元工厂类
package com.hezeu.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
* @Classname ChessFlyWeightFactory
* @Description 享元工厂类
* @Date 2020/2/23 下午 11:29
* @Created by 朱进博 [email protected]
*/
public class ChessFlyWeightFactory {
        private static Map<String,ChessFlyWeight> map = new HashMap<>();

        public static ChessFlyWeight getChess(String color){
                if(map.get(color)!=null){
                        return map.get(color);
                }else{
                        ChessFlyWeight cfw = new ConcreteChessFlyWeight(color);
                        map.put(color,cfw);
                        return cfw;
                }

        }
}
五、测试类
package com.hezeu.flyweight;

/**
* @Classname Client
* @Description TODO
* @Date 2020/2/23 下午 11:47
* @Created by 朱进博 [email protected]
*/
public class Client {
        public static void main(String[] args) {
                ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");
                ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess("白色");

                System.out.println(chess1);
                System.out.println(chess2);

                System.out.println("-------增加外部状态的处理------");
                chess1.display(new UnsharedConcreteFlyWeight(10,10));
                chess2.display(new UnsharedConcreteFlyWeight(20,20));

        }
}

结果如下:

在这里插入图片描述

五、享元模式的优缺点:

优点:

  • 极大减少内存中对象的数量
  • 相同或相似对象内存中只存一份,极大的节约资源,提高系统性能
  • 外部状态相对独立,不影响内部状态

缺点:

  • 模式比较复杂,使程序逻辑复杂化
  • 为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间边长,用时间换空间
感谢阅读,水平有限,如有错漏,还请不吝赐教
发布了11 篇原创文章 · 获赞 13 · 访问量 1294

猜你喜欢

转载自blog.csdn.net/weixin_44789225/article/details/104472516