首页 > 其他分享 >享元模式(FlyWeight )

享元模式(FlyWeight )

时间:2022-11-25 20:46:30浏览次数:56  
标签:享元 String Pet 模式 name FlyWeight public 享元类 Man

共享对象!

目的:

  减少创建对象的数量,以减少内存占用和提高性能。

核心奥义:

  通过享元类工厂来控制类的生成,相同的对象被放在Map中。

享元对象的结构:

  内部状态:可以共享。一般为不可变的属性。

  外部状态:不可以共享。一般为可变的属性。


 

例子

享元类接口:包含了享元类要实现的方法。

interface InMan{
    String getName();
    void lookPet(Pet pet);
}

享元类:外部状态不影响它。

class Man implements InMan{
    private String name;//内部状态

    //构造器获得属性
    public Man(String name) { this.name = name; }

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

    //外部状态,为可变化的类
    @Override
    public void lookPet(Pet pet) {
        System.out.println(name+"的宠物是:"+pet.getName());
    }
}

外部状态:一个宠物。

class Pet{
    private String name;
public Pet(String name) { this.name = name; }
public String getName() { return name;} }

享元类工厂:控制对象的产生。

class ManFactory{
    //享元池
    private static Map<String,InMan> map = new HashMap<>();

    //获取一个享元对象
    public static InMan getManInstance(String name){
        if(map.get(name)!=null){//池里有,直接拿去用
            return map.get(name);
        }else {//池里没有,新建一个
            InMan man = new Man(name);
            map.put(name,man);
            return man;
        }
    }
}

测试程序:

public static void main(String[] args) {
        Man man1= (Man) ManFactory.getManInstance("小五");
        Man man2= (Man) ManFactory.getManInstance("小五");
        Man man3= (Man) ManFactory.getManInstance("三号");
        System.out.println("man1对象地址:"+man1.hashCode());
        System.out.println("man2对象地址:"+man2.hashCode());
        System.out.println("man3对象地址:"+man3.hashCode());
        man1.lookPet(new Pet("狗狗"));
        man2.lookPet(new Pet("猪猪"));
    }

测试结果:

 

标签:享元,String,Pet,模式,name,FlyWeight,public,享元类,Man
From: https://www.cnblogs.com/lurenjia-bky/p/16926296.html

相关文章

  • [设计模式] Factory Method
    [设计模式]FactoryMethod动机在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new)......
  • [设计模式] Template Method
    TemplateMethod动机在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务......
  • LVS负载均衡集群——DR模式
    一、LVS-DR集群介绍LVS-DR(LinuxVirtualServerDirectorServer)工作模式,是生产环境中最常用的一种工作模式。1.1LVS-DR工作原理LVS-DR模式,DirectorServer作为群集......
  • 线程锁在单例模式中的应用
    多个线程在执行过程中会因为竞争同一个资源而产生线程冲突,造成死锁,从而引出线程锁这个概念先拿到锁再执行业务操作:当然我对这一块了解的还不透彻,只是了解在不加锁的多线......
  • 非交互模式写入crontab定时任务
    #执行以下命令(crontab-l;echo"00***cmd")|crontab#查看有没有,有就在运行,不用reload什么crontab-l#主要是把列表剔除想删掉的行,再整体倒到crontab里cr......
  • 聊一聊装饰者模式
    是你,还是你,一切都有你!——装饰者模式一、概述装饰者模式(DecoratorPattern)允许向一个现有的对象扩展新的功能,同时不改变其结构。主要解决直接继承下因功能的不断横向扩......
  • RabbitMQ入门学习系列(四) 发布订阅模式
    什么时发布订阅模式把消息发送给多个订阅者。也就是有多个消费端都完整的接收生产者的消息换句话说把消息广播给多个消费者消息模型的核心RabbitMQ不发送消息给队列,生产者......
  • 设计模式你怎么看?--抽象工厂模式
    一 前言在设计模式中有简单工厂,工厂方法,抽象工厂,这三种工厂方法,各自有各自的特点,但有都有共同的特点工厂(Factory)都是围绕着工厂类转,这篇只写"抽象工厂"相关的内......
  • 易基因|TSD物种全基因组DNA甲基化模式对孵育性别和过去孵育温度的响应 | 性别决定
    易基因|TSD物种全基因组DNA甲基化模式对孵育性别和过去孵育温度的响应|性别决定大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2022年8月23日,《MOLECULAR......
  • VirtualBox-网络模式(翻译翻译)
    VirtualBox网络模式详情见官网文档:https://www.virtualbox.org/manual/UserManual.html#networkingdetails在VirtualBox的网络配置里面,连接方式有以下几种网络模......