设计模式(二十五)------23种设计模式(17):享元模式

来源:互联网 发布:建自已顶级域名服务器 编辑:程序博客网 时间:2024/06/18 04:36

使用频率:★☆☆☆☆

一、什么是享元模式

大量细粒度对象共享复用

二、补充说明

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

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

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

三、角色

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

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

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

客户端:使用享元对象

四、例子,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:1str: helloid:2str: helloid:3com.pichen.dp.structuralpattern.flyweight.ShareStr@feb48com.pichen.dp.structuralpattern.flyweight.ShareStr@feb48truecom.pichen.dp.structuralpattern.flyweight.ShareStr@11ff436false
复制代码

 


@Author      风一样的码农
@HomePageUrl http://www.cnblogs.com/chenpi/ 
@Copyright      转载请注明出处,谢谢~ 

使用频率:★☆☆☆☆

一、什么是享元模式

大量细粒度对象共享复用

二、补充说明

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

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

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

三、角色

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

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

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

客户端:使用享元对象

四、例子,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:1str: helloid:2str: helloid:3com.pichen.dp.structuralpattern.flyweight.ShareStr@feb48com.pichen.dp.structuralpattern.flyweight.ShareStr@feb48truecom.pichen.dp.structuralpattern.flyweight.ShareStr@11ff436false
复制代码

 


@Author      风一样的码农
@HomePageUrl http://www.cnblogs.com/chenpi/ 
@Copyright      转载请注明出处,谢谢~ 
原创粉丝点击