11享元模式

一、什么是享元模式

   Flyweight模式也叫享元模式,是构造型模式之
一,它通过与其他类似对象共享数据来减小内存占用。


二、享元模式结构

                                                                                                                                                  接口(可省略)

三、享元模式的角色即职责

抽象享元角色:
                   所有具体享元类的父类,规定一些需要实现的公共接口。
具体享元角色:
                  抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。
享元工厂角色:

                  负责创建和管理享元角色。

四、享元模式实例

step1:

package com.dzg.learn.flyweight;

public class MyCharacter {
    private String mychar;

    public MyCharacter(String mychar) {
        this.mychar = mychar;
    }

    public void display(){
        System.out.println(mychar);
    }
}

step2:

package com.dzg.learn.flyweight;

import java.util.HashMap;
import java.util.Map;

public class MyCharacterFactory {
    private Map<String,MyCharacter> pool;

    public MyCharacterFactory() {
        pool = new HashMap<String, MyCharacter>();
    }

    public MyCharacter getMyCharacter(String str){
        MyCharacter myChar = pool.get(str);//返回character键所对应的值
        if(myChar == null){
            /*
            若myChar为空,则为其申请一个内存空间,
            并将其放入已有的数据池中,下次进行创建新的数据时,在数据池中进行搜索,
            若存在直接使用,否则创建新的,从而达到节省内存的目的
             */
            myChar = new MyCharacter(str);
            pool.put(str,myChar);
        }
        return myChar;
    }
}

step3:

package com.dzg.learn.flyweight;

public class TestFlyCharacter {
    public static void main(String[] args) {
        /*MyCharacter character1 = new MyCharacter("a");
        MyCharacter character2 = new MyCharacter("b");
        MyCharacter character3 = new MyCharacter("a");
        MyCharacter character4 = new MyCharacter("d");
        character1.display();
        character2.display();
        character3.display();
        character4.display();
        System.out.println(character1 == character3); //false说明两个数是指向不同的引用,占用不同的内存空间
        */

        //1.创建工厂
        MyCharacterFactory factory = new MyCharacterFactory();

        //2.从工厂中取出相应的MyCharacter
        MyCharacter str1 = factory.getMyCharacter("aaa");
        MyCharacter str2 = factory.getMyCharacter("bbb");
        MyCharacter str3 = factory.getMyCharacter("aaa");
        MyCharacter str4 = factory.getMyCharacter("ccc");

        str1.display();
        str2.display();
        str3.display();
        str4.display();

        System.out.println(str1 == str3);   //true str1和str2指向相同内存空间,达到节省内存的目的
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值