Java设计模式之享元模式示例详解

目录
  • 定义
  • 原理类图
  • 案例
    • 需求
    • 方案:享元模式
  • 分析
  • 总结

定义

享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式。

原理类图

  • Flyweight :抽象的享元角色,他是抽象的产品类,同时他会定义出对象的内部状态和外部状态
  • ConcreteFlyweight :是具体的享元角色,具体的产品类,实现抽象角色,实现具体的业务逻辑
  • UnsharedConcreteFlyweight :不可共享的角色,这个角色也可能出现在享元模式中
  • FlyweightFactory :享元工厂类,用于构建一个池的容器,同时在享元工厂里会提供公共方法 (从池子里获取对象,获取池子里的对象总数,根据key获取对象,,)
  • Client:客户端了,使用享元模式去完成业务逻辑

案例

需求

我们接了一个小型的外包项目,给客户老王做一个产品展示网页,老王的朋友们感觉效果不错,也希望做这样的产品展示网页,但是他们要求都有些不同

1)有客户要求网页以新闻的形式发布

2)有客户要求网页以博客的形式发布

3)有客户希望网页以微信公众号的形式发布

方案:享元模式

定义网站用户类

public class User {
    private String name;

    public User(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

定义网站抽象类——享元角色

public abstract class Website {
    public abstract void show(User user);
}

定义具体的网站类——具体的享元角色

public class ConcreteWebsite extends Website{
    // 网站的发布形式
    private String type;

    public ConcreteWebsite(String type){
        this.type = type;
    }

    @Override
    public void show(User user) {
        System.out.println("以" + type + "形式发布网站");
        System.out.println("网站的用户名是:" + user.getName());
    }
}

定义网站工厂类——享元工厂类

public class WebsiteFactory {
    // 创建HashMap,充当池的角色
    private HashMap<String, ConcreteWebsite> pool = new HashMap<String, ConcreteWebsite>();

    // 根据类型判断,获取池子里的对象
    public Website getWebsite(String type){
        if(!pool.containsKey(type)){
            pool.put(type,new ConcreteWebsite(type));
        }
        return pool.get(type);
    }

    // 获取池子里的对象总数
    public int getWebsiteCount(){
        System.out.println("当前池子里的对象总数:" + pool.size());
        return pool.size();
    }
}

定义客户端测试类

public class Client {
    public static void main(String[] args) {
        //创建一个享元工厂
        WebsiteFactory websiteFactory = new WebsiteFactory();
        Website news = websiteFactory.getWebsite("新闻");
        news.show(new User("老李"));
        Website wechat = websiteFactory.getWebsite("博客");
        wechat.show(new User("老高"));
        websiteFactory.getWebsiteCount();
        Website wechat1 = websiteFactory.getWebsite("微信");
        wechat.show(new User("老沈"));
        websiteFactory.getWebsiteCount();
    }
}

查看测试结果

分析

通过一个工厂类来根据不同类型的需求,从而生成对应的具体的享元对象,实现了需求。其中享元对象的信息分为两个部分,内部状态和外部状态。内部对象是指对象共享出来的信息,存储在享元对象内部,不随着环境的改变而改变,外部对象随着环境的改变而改变,不可共享的状态。

总结

优势

节省内存空间,重复对象需要被频繁创建的时候,享元模式由于只会被创建一次,所以对系统的内存空间的需求大大减小

提高使用效率,对于可重复的对象只创建一次,再次访问时直接从池子里拿,相应速度更快,效率也会更高局限性享元模式会提高

劣势

享元模式会提高系统的复杂度,享元模式需要有一个工厂类加以控制,如果盲目使用,会提高系统逻辑的复杂度

使用场景

享元模式最经典的使用场景就是我们各类池技术了

系统中有大量对象的时候,这些对象消耗大量内存,可以考虑使用享元模式

到此这篇关于Java设计模式之享元模式示例详解的文章就介绍到这了,更多相关Java享元模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入理解Java设计模式之享元模式

    目录 一.引言 二.什么是享元模式 三.享元模式的结构 四.享元模式和单例模式的异同 五.享元模式的优缺点 六.享元模式的使用场景 七.享元模式的实现 八.总结 一.引言 大家都知道单例模式,通过一个全局变量来避免重复创建对象而产生的消耗,若系统存在大量的相似对象时,又该如何处理?参照单例模式,可通过对象池缓存可共享的对象,避免创建多对象,尽可能减少内存的使用,提升性能,防止内存溢出. 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就

  • 浅谈JAVA设计模式之享元模式

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式.由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象. 介绍 意图: 运用共享技术有效地支持大量细粒度的对象. 主要解决: 在有大量

  • Java设计模式之享元模式实例详解

    本文实例讲述了Java设计模式之享元模式.分享给大家供大家参考,具体如下: 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweigh

  • 23种设计模式(21)java享元模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. Java中的String类型 在JAVA语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在J

  • Java设计模式之享元模式

    本文介绍了Java设计模式之享元模式,供大家参考,具体内容如下 1.关于享元模式 享元模式有点类似于单例模式,都是只生成一个对象被共享使用.享元模式主要目的就是让多个对象实现共享,减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗. 2.享元模式结构图 因为享元模式结构比较复杂,一般结合工厂模式一起使用,在它的结构图中包含了一个享元工厂类. 在享元模式结构图中包含如下几个角色: Flyweight(抽象享元类):通常是一个接口或抽象类,

  • Java设计模式之享元模式示例详解

    目录 定义 原理类图 案例 需求 方案:享元模式 分析 总结 定义 享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式. 原理类图 Flyweight :抽象的享元角色,他是抽象的产品类,同时他会定义出对象的内部状态和外部状态 ConcreteFlyweight :是具体的享元角色,具体的产品类,实现抽象角色,实现具体的业务逻辑 UnsharedConcreteFlyweight :不可共享的角色,这个角色也可

  • Java结构型设计模式之享元模式示例详解

    目录 享元模式 概述 目的 应用场景 优缺点 主要角色 享元模式结构 内部状态和外部状态 享元模式的基本使用 创建抽象享元角色 创建具体享元角色 创建享元工厂 客户端调用 总结 享元模式实现数据库连接池 创建数据库连接池 使用数据库连接池 享元模式 概述 享元模式(Flyweight Pattern)又称为轻量级模式,是对象池的一种实现.属于结构型模式. 类似于线程池,线程池可以避免不停的创建和销毁多个对象,消耗性能.享元模式提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用

  • JavaScript设计模式之享元模式实例详解

    本文实例讲述了JavaScript设计模式之享元模式.分享给大家供大家参考,具体如下: 通过两个例子的对比来凸显享元模式的特点:享元模式是一个为了提高性能(空间复杂度)的设计模式,享元模式可以避免大量非常相似类的开销. 第一实例,没有使用享元模式,计算所花费的时间和空间使用程度. 要求为:有一个城市要进行汽车的登记 (1)汽车类 /** * 制造商 * 型号 * 拥有者 * 车牌号码 * 最近一次登记日期 */ var Car = function(make,model,year,owner,t

  • C++设计模式编程之Flyweight享元模式结构详解

    由遇到的问题引出享元模式: 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为没有字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费.例如一个字母"a"在文档中出现了100000 次,而实际上我们可以让这一万个字母"a"共享一个对象,当然因为在不同的位置可能字母"a"有不

  • Java设计模式之抽象工厂模式实例详解

    本文实例讲述了Java设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 具体工厂类:生产创建某一类具体产品对象. 抽象产品类可以使用接口或者父类来描述产品对象的行为特征. 具体产品类就是某一具体的对象. 那么抽象工厂模式和工厂模式的不同之处呢? 其实最大的不同就在于,在产品类的结构更加复杂时,抽象工厂模式针对不同的产品族(就是一类产品对象)定义了不同的行为,也就是在父类或接口中,定义了不同的产生方法.不同的产品族调用各自的创建方法.同时不同的产品族横向比较,也有可归类的相同特征,这些特征

  • C#设计模式之职责链模式示例详解

    前言 在软件开发中,我们通常会遇到一种场景,比如某个请求,会依次经过系统中的很多个模块来处理,如果某个模块处理不了,则将请求传递给下一个模块,比如在订单处理中,首先要经过用户校验,商品库存充足校验,如果不满足条件,返回错误,如果满足条件才会到下一步处理. 在ASP.NET Core里有middleware中间键的概念,每一个请求进来,都会经过一系列的Handler,这是一种职责链模式,每一个Handler都会决定是否处理该请求,以及是否决定将该请求传递给一下请求继续处理. 在.NET的委托中,也

随机推荐