12 【结构型】 浅谈享元模式的理解与使用

享元模式

享元模式也是为了减少对象的创建,进而减少内存的重复利用而被使用的,这个和之前我们学过的单例模式,还有原型模式有着近似的相同之处,

这里大致复习一下,

单例模式:系统内只存在一个对象,比如windows里面只会存在一个任务管理器,一样的道理。

原型模式:原型模式则是通过实现Cloneable接口,调用Object 的clone方法,生成一个相同的对象。

而享元模式,有一个关键词,那就是共享,这些对象创建好之后会被共享,比如我需要一个圆形,要是内存里面已经存在这个对象,直接将这个对象的引用回传给我直接使用即可。

这里需要灵魂画师来操作一波!

这里模拟一个常见的windows窗口程序,比如我们可以用JAVA的Swing组件来画出窗口,这里的需求是这样的,我需要在这个窗口内画出100个圆形,总不可能你一个对象一个对象的来创建把,并且把他们摆放在不同的位置,

这里就按照这个需求,我们来操作一波

代码理解

形状接口,用来定义画出的形状,这里我们只是画一个圆形为例

public interface Shape {

    //画出形状
    void draw();
}

创建一个圆形对象实现形状接口,它可以画出圆形,有一些自己的属性,比如坐标,以及画出来的颜色

public class circle implements Shape {

    //x坐标
    private int x;
    //y坐标
    private int y;
    //圆的颜色
    private String color;

    @Override
    public void draw() {
        System.out.println("画出圆形在x:"+x+"y:"+y+"颜色:"+color);
    }

    //get and set
}

一个形状的工厂,用于创建出圆形这个形状,map是一个集合,用于储存创建出来的共享对象,当需要加载一个对象的时候,先去查找这个颜色的对象存在不,存在则直接返回,不存在则创建后返回,并且

保存创建的那个对象,以便于下次直接使用。

public class ShapeFactory {

    private static Map<String, circle> map = new HashMap<>();

    public static Shape getShape(String color) {

        circle shape = map.get(color);

        //共享对象里面没有,则创建一个下次用
        if (shape == null) {
            shape = new circle();
            shape.setColor(color);
            map.put(color, shape);
            System.out.println("创建了一个新圆:color="+color);
        }
        return shape;
    }
}

开始测试,创建20个对象,分别是数组里面颜色的圆形,有则从共享的对象内部返回,没有则创建返回,

    private static String[] colors = new String[]{"red", "blue", "yellow", "black"};

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {

            int index = (int)Math.round(Math.random()*3);
            String color = colors[index];
            circle temp = (circle) ShapeFactory.getShape(color);
            temp.draw();

        }
    }

//结果 可以看出在创建好了需要的对象后,后面再次调用,直接返回即可。无需再次创建

参考:https://www.runoob.com/design-pattern/flyweight-pattern.html

码云:https://gitee.com/mrc1999/23GOF

原文地址:https://www.cnblogs.com/ChromeT/p/11746152.html

时间: 2024-10-12 07:24:26

12 【结构型】 浅谈享元模式的理解与使用的相关文章

结构型设计模式之享元模式

结构 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 一个应用程序使用了大量的对象. 完全由于使用大量的对象,造成很大的存储开销. 对象的大多数状态都可变为外部状态. 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象. 应用程序不依赖于对象标识.由于F l y w e i g h t 对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值. 1 using System; 2 using System.Collections; 3 4 class Flyweigh

java-设计模式(结构型)-【享元模式】

1.享元模式(Flyweight) 定义:享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用.   1.1 工厂 //工厂:内置一个池,如果存在了则取出,否则则创建加入池中 public class FactoryPool { private Hashtable<String,Person> pool=new Hashtable<String,Person>(); public Person getPerson(String

GOF23设计模式之享元模式之理解

 享元模式(FlyWeight)      内存属于稀缺资源,不要随便浪费.如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存.      节省了内存,有些时候,会造成运行时间的加长. 核心:      享元模式以共享的方式高效地支持大量细粒度对象的重用      享元对象能做到共享的关键是区分了内部状态和外部状态.          内部状态:可以共享,不会随环境变化而改变.          外部状态:不可以共享,会随环境变化而改变.   围棋软甲设计:      每个围棋

10 浅谈 装饰器模式的理解与使用

在不改变现有类结构的情况下,为这个类添加一个新的功能,这就是装饰器模式 所属与结构型模式, 这种模式的特点是:需要创建一个装饰类来包装原有的类,并且提供额外的功能. 为了解决:平时使用继承的方式,会带入许多静态的方法,导致子类过度饱和,膨胀. 举例子:悟空拥有七十二变,不管它怎么变化,他的本质还是一只猴子,但是他又有变化后的一些本领(功能) 实现:装饰类包含原有类的实例对象,即可实现装饰器模式 开始: 定义一个形状的接口 //画图接口 public interface Shape { void

设计模式(享元模式)

享元模式可以理解是一个对象的缓存,通过构建一个享元工厂对所有的对象进行管理. 代码如下: Flyweight 享元的接口 public interface Flyweight { public void doAction(); } FlyweightImpl 具体被共享的类实现 public class FlyweightImpl implements Flyweight{ @Override public void doAction() { System.out.println("doActi

设计模式@第14章:享元模式

第14章:享元模式 一.展示网站项目需求 小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同: 有客户要求以新闻的形式发布 有客户人要求以博客的形式发布 有客户希望以微信公众号的形式发布 二.传统方案解决网站展现项目 直接复制粘贴一份,然后根据客户不同要求,进行定制修改 给每个网站租用一个空间 方案设计示意图 14.3 传统方案解决网站展现项目-问题分析 需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空

设计模式-12 享元模式(结构型模式)

一 享元模式 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建. 关键代码:存储相似的对象 使用场景: 1.系统有大量相似对象. 2.需要缓冲池的场景. 类图 : 二 实现代码 Java里面的JDBC连接池,适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接 池来说,url.driv

12 结构型模式-----享元模式

模式动机(Flyweight Pattern):顾名思义,享元模式就是运用共享技术解决大量细粒度对象的复用问题.在享元模式中,由工厂负责维护一个享元池(Flyweight Pool),用于存储具有相同内部状态的一些对象.所谓内部状态,是指一个对象的特征,我们把大多数该类对象的不变特征确定为共享特征,将其抽象为一个类放到享元池中,对于可变的部分可以通过外部状态参数传入来解决.这样的话,如果客户要使用该类型的对象,只需通过工厂从享元池中取出即可,只有在享元池中不存在的对象才会被工厂创建出来. 模式结

&quot;围观&quot;设计模式(17)--结构型之享元模式(Flyweight Pattern)

享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存.通常物件中的部分状态是可以分享.常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元.----WIKIPEDIA 个人理解 共享,内存消耗大的时候应考虑对象的共享,共享对象可以减少对象的生成数量,这样可以减少内存的消耗,当一个对象和其他的对象存在共性且内容一致的时候,可以将共有