首页 > 其他分享 >一句话设计模式6:享元模式

一句话设计模式6:享元模式

时间:2023-06-12 16:37:59浏览次数:43  
标签:享元 name 对象 create 模式 设计模式 public String


享元模式:局部单例模式。



文章目录

  • 享元模式:局部单例模式。
  • 前言
  • 一、享元模式的作用
  • 二、如何实现享元模式
  • 总结



前言

享元模式其实很简单,但是如果用好,确实可以达到减少内存,事半功倍的效果;适合 系统要创建大量相似对象,相同对象等;


一、享元模式的作用

1 享元模式可以解决对象的重复创建问题,为什么说是局部单例? 因为他不是全局单例,仅仅是在调用某个方法的时候,才会获取到同一个对象;
2 但是它在这个小范围内确实是单例的,获取的一直都是同一个对象;

二、如何实现享元模式

例如: 我现在想创建一个(一类)对象,我不去直接创建,类似于弄个工厂的感觉,去创建对象,然后根据入参,创建出我想要的一个(一类)对象

开始编码:

  • 创建对象的标准类
public interface XYBean {

    public String getName();
}
  • 具体对象类
public class XYBean1 implements XYBean{
   private String name;

   @Override
   public String getName() {
       return null;
   }

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

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

   public XYBean1() {
       System.out.println("我被初始化了");
   }
}
  • 类似创建对象的工厂
public class CreateBean {
    private Map<String, XYBean> map = new HashMap<>();

    public XYBean create(String name) {
        if (!map.containsKey(name)) {
            map.put(name, new XYBean1());
        }
        return map.get(name);
    }
}

1 map 相当于每次将创建的对象缓存起来
2 通过create方法创建的对象,只有第一次是创建的,之后每次都是从缓存中获取的同一个对象;

  • 测试类
public class Test {
    public static void main(String[] args) {

        CreateBean createBean = new CreateBean();
        XYBean xyBean = createBean.create("xy");
        System.out.println(xyBean);
        System.out.println(createBean.create("xy"));
        System.out.println(createBean.create("xy"));
        System.out.println(createBean.create("xy"));
        System.out.println(createBean.create("xy"));
    }
}

一句话设计模式6:享元模式_设计模式

1 可以看到只有第一次调用的时候,XYBean1的构造方法才会被调用,之后不会在调用了
2 可以看到每次打印的对象地址,都是同一个对象,无论如何调用这个工厂的创建方法,返回的都是同一个对象—局部单例


总结

享元模式的思想就是 将创建的好的对象,利用缓存达到只创建一次,之后无论如何调用,都不会重复创建的目的,代码相对简单,需要找到适合此种模式的场景;
设计模式没有高低贵贱之分,只有是否合适场景之分;


标签:享元,name,对象,create,模式,设计模式,public,String
From: https://blog.51cto.com/u_16158506/6463430

相关文章

  • 一句话设计模式5:责任链模式
    责任链模式:步步为营。文章目录责任链模式:步步为营。前言一、责任链模式的作用二、如何实现责任链1既然是责任链,那么就需要一个链路的承载体ChainBody2责任链中每一步都是一个抽象类,因为承载体仅仅是构造链路顺序,里面不放置任何具体业务逻辑:步骤抽象类3具体步骤执行,继承......
  • 关于浏览器的PWA模式
    浏览器的PWA模式是一种可安装(Installable),可以出现在设备的主屏幕。关于开发如何识别PWA模式constisInStandaloneMode=()=>(window.matchMedia('(display-mode:standalone)').matches)......
  • Redis集群-哨兵模式搭建(1主2从3哨兵节点)
    Redis集群-哨兵模式搭建(1主2从3哨兵节点)原创 北极星 运维记事 2023-04-2022:47 发表于四川收录于合集#redis8个主机规划类型IP地址端口号主192.168.77.1456379从1192.168.77.1466379从2192.168.77.1476379哨兵1192.168.77.14526379哨兵2......
  • MySql5.7主从同步配置(gtid模式)
    mysql数据库主从同步配置是开发中比较常见的需求,在MySql里,主从同步主要有两种,bin-log和gtid。下面就主要总结一下使用gtid模式配置主从同步的过程。1.概念全局事务标识:globaltransactionidentifiers;GTID是一个事务一一对应,并且全局唯一ID;一个GTID在一个服务器上只执行一次,避免......
  • 设计模式之装饰者模式--钢铁侠的形成
    前言本文主要讲述java常见设计模式之装饰者模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。一.什么是装饰者模式装饰者模式是23种设计模式中结构型模式的一种,它的核心思想是在不必改变类文件及不使用继承的情况下,通过装饰者包裹目标对象,动态地扩......
  • Android中Activity的启动模式
    Android中Activity的启动模式一共有4种,分别是standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来指定启动模式。1、standard在standard模式下,每当启动一个新的Activity,他就会在返回栈中入栈,并处于......
  • 05.工厂方法模式
    使用工厂方法模式来解决问题定义定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到其子类。应用工厂方法式来解决问题的思路工厂方法模式的解决思路很有意思,那就是不解决,采取无为而治的方式:不是需要接口对象吗,那就定义一个方法来创......
  • redis四种模式
    1、单机模式单机模式就是在一台服务器上安装redis,然后启动,所有业务都调用这一台redis服务器。优点:部署简单,只需要在一台服务器上安装并启动redis就行。成本低,没有备用节点,不需要其他的开支。高性能,单机不需要同步数据,数据天然一致性。缺点:可靠性较弱,一旦服务器宕机,所有业务......
  • 代理模式的简单理解
    1.废话​ 上次io流联系的时候,有一个地方有待优化,计划使用代理模式。恰逢开始写博客,着闲着也是闲着记录一下丰富一下我的博客记录,之前看过一些网上其他的代理的讲解都很高端,我这技术有限只说一下自己理解的代理模式2.背景​ 之前统计项目中废没在被使用的VUE文件时写了一个遍历......
  • 单例模式(static应用场景)
     单例模式(Singleton) 设计-->一个类只能创建一个对象有效减少内存占用空间 设计一个系统--->百度搜索引擎 publicclassBaidu{ publicvoid搜索(Stringkeyword){ } } 创建一个Baidu对象new 调用搜索的方法做事情方法执行一遍 同一时间有很多很多......