【设计模式】享元模式

简介:

一、什么是享元模式

大量细粒度对象共享复用

二、补充说明

可以节约内存空间,提高系统的性能;

一个对象有内部和外部两种状态,内部状态是不变的,外部状态是可变的,把一个对象分成内部状态和外部状态,然后通过共享内部状态,达到节约内存空间的目的;

应用场景举例:一个文档中多次出现相同的图片;一篇文章中出现了很多重复的字符串;围棋的棋子(黑棋和白旗);

三、角色

抽象享元:一个接口或抽象类;

具体享元:内部状态为其成员属性,其实例为享元对象,可以共享;

享元工厂:生产享元对象,将具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合;

客户端:使用享元对象

四、例子,JAVA实现

一个共享字符串的例子

抽象享元

复制代码
package com.pichen.dp.structuralpattern.flyweight;


public interface IFlyweight {

    //id为外部状态,不共享
    public void setId(int id);
}
复制代码

具体享元

复制代码
package com.pichen.dp.structuralpattern.flyweight;

public class ShareStr implements IFlyweight{
    //内部状态str作为成员变量,共享的.
    private String str;

    public ShareStr(String str) {
        this.str = str;
    }

    //id为外部状态,不共享
    @Override
    public void setId(int id) {
        System.out.println("str: " + str + "id:" + id);
    }
    
    

}
复制代码

享元工厂

复制代码
package com.pichen.dp.structuralpattern.flyweight;

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

public class FlyweightFactory {

    private Map<String, Object> strMap = new HashMap<String, Object>();
    
    public IFlyweight getInstance(String str){
        
        IFlyweight fly = (IFlyweight) strMap.get(str);
        
        if(fly == null){
            fly = new ShareStr(str);
            strMap.put(str, fly);
        }
        
        return fly;
    }
}
复制代码

客户端

复制代码
package com.pichen.dp.structuralpattern.flyweight;

public class Main {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        
        ShareStr hello = (ShareStr) factory.getInstance("hello");
        hello.setId(1);
        
        ShareStr hello2 = (ShareStr) factory.getInstance("hello");
        hello.setId(2);
        
        ShareStr test = (ShareStr) factory.getInstance("test");
        hello.setId(3);

        System.out.println(hello);
        System.out.println(hello2);
        System.out.println(hello.equals(hello2));
        
        System.out.println(test);
        System.out.println(hello.equals(test));
        
        
        
    }
}
复制代码

打印结果:

复制代码
str: helloid:1
str: helloid:2
str: helloid:3
com.pichen.dp.structuralpattern.flyweight.ShareStr@feb48
com.pichen.dp.structuralpattern.flyweight.ShareStr@feb48
true
com.pichen.dp.structuralpattern.flyweight.ShareStr@11ff436
false
复制代码

 

本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5207208.html,如需转载请自行联系原作者
相关文章
|
6月前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
97 4
|
6月前
|
设计模式
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
|
2月前
|
设计模式 Java
Java设计模式-享元模式(12)
Java设计模式-享元模式(12)
|
3月前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
4月前
|
设计模式 存储 JavaScript
js设计模式【详解】—— 享元模式
js设计模式【详解】—— 享元模式
65 6
|
5月前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
5月前
|
设计模式 存储 Java
Java设计模式之享元模式详解
Java设计模式之享元模式详解
|
5月前
|
设计模式
享元模式-大话设计模式
享元模式-大话设计模式
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
6月前
|
设计模式 存储 Java
小谈设计模式(27)—享元模式
小谈设计模式(27)—享元模式