开发者社区> 毓秀清荷> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java设计模式系列-享元模式

简介: ​ 一、概述 享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在。 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。
+关注继续查看

一、概述

享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在。

享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。这个对象就可以避免到修改的问题。

享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。

二、示例

下面我们来看一个简单的例子:

建筑接口:JianZhu

public interface Jianzhu {
    void use();
}

体育馆实现类:TiYuGuan

public class TiYuGuan implements Jianzhu {
    private String name;
    private String shape;
    private String yundong;
    public TiYuGuan(String yundong){
        this.setYundong(yundong);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getShape() {
        return shape;
    }
    public void setShape(String shape) {
        this.shape = shape;
    }
    public String getYundong() {
        return yundong;
    }
    public void setYundong(String yundong) {
        this.yundong = yundong;
    }
    @Override
    public void use() {
        System.out.println("该体育馆被使用来召开奥运会" + "  运动为:"+ yundong+"  形状为:"+shape+ "  名称为:"+name);
    }
}

建筑工厂类:JianZhuFactory

import java.util.*;

public class JianZhuFactory {
    private static final Map<String,TiYuGuan> tygs = new HashMap<String,TiYuGuan>();
    public static TiYuGuan getTyg(String yundong){
        TiYuGuan tyg = tygs.get(yundong);
        if(tyg == null){
            tyg = new TiYuGuan(yundong);
            tygs.put(yundong,tyg);
        }
        return tyg;
    }
    public static int getSize(){
        return tygs.size();
    }
}

测试类:Clienter

public class Clienter {
    public static void main(String[] args) {
        String yundong ="足球";
        for(int i = 1;i <= 5;i++){
            TiYuGuan tyg = JianZhuFactory.getTyg(yundong);
            tyg.setName("中国体育馆");
            tyg.setShape("圆形");
            tyg.use();
            System.out.println("对象池中对象数量为:"+JianZhuFactory.getSize());
        }
    }
}

执行结果:

该体育馆被使用来召开奥运会  运动为:足球  形状为:圆形  名称为:中国体育馆
对象池中对象数量为:1
该体育馆被使用来召开奥运会  运动为:足球  形状为:圆形  名称为:中国体育馆
对象池中对象数量为:1
该体育馆被使用来召开奥运会  运动为:足球  形状为:圆形  名称为:中国体育馆
对象池中对象数量为:1
该体育馆被使用来召开奥运会  运动为:足球  形状为:圆形  名称为:中国体育馆
对象池中对象数量为:1
该体育馆被使用来召开奥运会  运动为:足球  形状为:圆形  名称为:中国体育馆
对象池中对象数量为:1

三、模式解析

如上示例中,使用工厂模式进行配合,创建对象池,测试类中的循环,你可以想象成为要举行5场比赛,每场比赛的场地就是体育馆

通过执行结果可以看出,在这个对象池(HashMap)中,一直都只有一个对象存在,第一次使用的时候创建对象,之后的每次调用都用的是那个对象,不会再重新创建。

其实在Java中就存在这种类型的实例:String。

    Java中将String类定义为final(不可改变的),JVM中字符串一般保存在字符串常量池中,这个字符串常量池在jdk 6.0以前是位于常量池中,位于永久代,而在JDK 7.0中,JVM将其从永久代拿出来放置于堆中。

    我们使用如下代码定义的两个字符串指向的其实是同一个字符串常量池中的字符串值。
String s1 = "abc";
String s2 = "abc";

如果我们以s1==s2进行比较的话所得结果为:true,因为s1和s2保存的是字符串常量池中的同一个字符串地址。这就类似于我们今天所讲述的享元模式,字符串一旦定义之后就可以被共享使用,因为他们是不可改变的,同时被多处调用也不会存在任何隐患。

四、使用场景

当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空间。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java设计模式系列(2)享元模式
一、概述 享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在。 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。
580 0
Java设计模式之一:单例模式
单例模式有好几种写法,可以根据需要与场景进行适当的选择。总结下单例模式的优缺点。 优点: 1、内存中对象唯一,可以节省内存空间; 2、可以做到避免频繁的创建销毁对象,提高性能; 3、避免对共享资源的不同对象占用,优化获取数据的途径; 4、为整个平台提供一个全局访问点。 缺点: 1、不适用于经常变化的对象; 2、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出; 3、如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;
42 0
浅谈JAVA设计模式之——单例模式(Singleton)
看几个单例对象的示例代码,其中有些代码是线程安全的,有些则不是线程安全的,需要大家细细品味,这些代码也是冰河本人在高并发环境下测试验证过的。
53 0
Java设计模式——单例模式——全局唯一 节省资源
本文目录 1. 场景 2. 简单实现 3. 简单实现的bug 4. 多线程环境保持单例 5. 效率不咋地 6. 提高多线程下效率
71 0
Java进阶专题(五) 设计模式之单例模式
今天开始我们专题的第四课了,最近公司项目忙,没时间写,今天抽空继续。上篇文章对工厂模式进行了详细的讲解,想必大家对设计模式合理运用的好处深有感触。本章节将介绍:单例模式与原型模式。本章节参考资料书籍《Spring 5核心原理》中的第一篇 Spring 内功心法(Spring中常用的设计模式)(没有电子档,都是我取其精华并结合自己的理解,一个字一个字手敲出来的)。
398 0
Java设计模式之单例模式的9种写法
《2019年阿里云双11活动拼团》:https://www.aliyun.com/1111/2019/group-buying-share【限时】1年86元,3年229元,用来建站和编程学习【附WordPress建站教程】 一. 什么是单例模式 因进程需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。
727 0
JAVA中的设计模式一(单例模式)
单例模式有以下特点:  1、单例类只能有一个实例。  2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
987 0
+关注
38
文章
103
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载