首页 > 编程语言 >12.(结构型模式)java设计模式之享元模式

12.(结构型模式)java设计模式之享元模式

时间:2023-01-15 15:23:03浏览次数:47  
标签:享元 category Company 模式 new 设计模式 public

一、什么是享元模式

  Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。

  • 属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能,它提供了减少对象数量从而改善应用所需的对象结构的方式。
  • 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

对象内容划分:

内部状态

  • 不会随环境的改变而有所不同,是可以共享的

外部状态

  • 不可以共享的,它随环境的改变而改变的,因此外部状态是由客户端来保持(因为环境的变化一般是由客户端引起的)

二、建造者的实现方式

模式结构分析:

  • 抽象享元(Flyweight)角色:为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入。
  • 具体享元(ConcreteFlyweight)角色:实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。
  • 享元工厂(FlyweightFactory)角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键。
  • 客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外部状态。

类关系图:

统一模型:

代码实现:

查看代码
/*
* 享元的抽象
* */
public abstract class CloudWebSite {
    public abstract void run(Company company);
}
/*
* 具体享元
* */
public class ConcreteWebSite extends CloudWebSite {

    private String category;
    public ConcreteWebSite(String category){
        this.category=category;
    }

    @Override
    public void run(Company company) {
        System.out.println("⽹站分类:"+category+", 公司:"+company.getName());
    }
}
/*
* 享元工厂
* */
public class WebSiteFactory {

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

    public CloudWebSite getWebSiteByCategory(String category){
        if(map.containsKey(category)){
            return map.get(category);
        }else {
            ConcreteWebSite site = new ConcreteWebSite(category);
            map.put(category,site);
            return site;
        }
    }
    /**
     * 获取分类个数
     * @return
     */
    public int getWebsiteCategorySize(){
        return map.size();
    }
}
/*
* 公司信息
* */
@Data
public class Company {
    String name;
    public Company(String name){
        this.name=name;
    }
}

测试用例:

/*
* 享元模式
* */
@Test
public void flyWeight(){
    WebSiteFactory factory = new WebSiteFactory();
    CloudWebSite companySite1 = factory.getWebSiteByCategory("企业官⽹");
    companySite1.run(new Company("⼩滴课堂"));
    CloudWebSite companySite2 = factory.getWebSiteByCategory("企业官⽹");
    companySite2.run(new Company("旭瑶课堂"));
    CloudWebSite byteDanceSite = factory.getWebSiteByCategory("信息流");
    byteDanceSite.run(new Company("字节跳动"));
    CloudWebSite ucNews = factory.getWebSiteByCategory("信息流");
    ucNews.run(new Company("优视科技"));
    System.out.println("⽹站分类总数:" +factory.getWebsiteCategorySize());
}

测试结果:

⽹站分类:企业官⽹, 公司:⼩滴课堂
⽹站分类:企业官⽹, 公司:旭瑶课堂
⽹站分类:信息流, 公司:字节跳动
⽹站分类:信息流, 公司:优视科技
⽹站分类总数:2

方法评估:

享元设计模式和原型、单例模式的区别:

  • 原型设计模式是指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
  • 单例设计模式保证一个类仅有一个实例。

优点:

  • 大大减少了对象的创建,降低了程序内存的占用,提高效率。

缺点:

  • 提高了系统的复杂度,需要分离出内部状态和外部状态。
  • 注意划分内部状态和外部状态,否则可能会引起线程安全问题,必须有一个工厂类加以控制。

标签:享元,category,Company,模式,new,设计模式,public
From: https://www.cnblogs.com/q994321263/p/16961866.html

相关文章

  • Ansible 学习笔记 - 定位主机和组的模式
    中英文对照表英文中文备注host主机group(主机)组pattern模式adhoc特别命令playbook剧本Ansible专有名词,一段复杂的编排inventory库存......
  • Ansible 学习笔记 - 定位主机和组的模式
    中英文对照表英文中文备注host主机group(主机)组pattern模式adhoc特别命令playbook剧本Ansible专有名词,一段复杂的编排inventory库......
  • 【数据库】PostgreSQL/PgSql-根据模式名和字段名查询有该字段的所有表信息【通过表元
    【数据库】PostgreSQL/PgSql-根据模式名和字段名查询有该字段的所有表信息【通过表元数据信息和函数实现】...哥们要飞于2022-08-2314:51:00发布304收藏文章标签:数......
  • Ubuntu进入紧急模式,无法进入桌面
    问题Ubuntu搭了很久,东西没做出来,BUG遇到不少,今天属于是手贱了,看到一个Ubuntu卡死的解决办法,我看他写的过程看起来很6,就试了一下,结果安全模式是进去了,但同时也造成了磁盘数......
  • CF生化全模式全装备单机版安装教程(基于CSOL)
    喜欢玩CF单机版的朋友平时应该接触过一些基于CS1.6的单机版,但是这种版本有些特性就是:改了分辨率就容易进不去游戏;变为幽灵时被枪射击时会出现视角乱晃的情况;游戏过程中场景......
  • 智慧城市商业模式
         智慧城市的切入点主要集中于以物联网产业发展为建设智慧城市的重要关注点;以基础设施建设为先导作为智慧城市的建设切入点;以民生保障与服务作为智慧城市建设......
  • 不止于新,德事TEC 引领“未来办公”新模式
    当下,人们对于“办公”和“办公场所”的定义都有所改变,而过去几年的疫情也促使越来越多的企业思考办公空间的变革及转型。新形势下,如何打造高品质办公空间,已成为商业地产亟需......
  • (Java)设计模式:结构型
    前言这篇博文续接的是UML建模、设计原则、创建型设计模式、行为型设计模式,有兴趣的可以看一下3.3、结构型这些设计模式关注类和对象的组合。将类和对象组合在一起,从......
  • VB6判断操作系统是否运行在安全模式
    PrivateDeclareFunctionGetSystemMetricsLib"user32"(ByValnIndexAsLong)AsLongPrivateConstSM_CLEANBOOT&=67 PublicFunctionIsSystemRunInSafeMode()A......
  • 学习记录-建造者模式
    建造者模式建造者模式(BuilderPattern),也叫生成器模式,使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方......