您的位置:首页 > 其它

设计模式之享元模式

2016-06-25 16:40 260 查看
什么是享元模式(Flyweight)

享元模式是池技术的重要实现方式

使用共享对象可有效地支持大量的细粒度的对象,避免过多的对象造成内存溢出

享元模式:内部状态和外部状态

内部状态:保持不变的状态,可以作为共享的状态

外部状态:一般随着环境的状态而改变的状态

享元对象的角色

Flyweight 抽象享元角色,产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现。

ConcreteFlyweight 具体享元角色,具体的一个产品类,实现抽象角色定义的业务

unsharedConcreteFlyweight 不可共享的享元角色

FlyweightFactory 构造一个池容器,同时提供从池中获取对象的方法。

示例代码

package com.pattern.flyweight;

/**
* 享元模式,抽象类,定义基本的操作
* @author yjzhou
*/
public abstract class Flyweight {
//内部状态
private  String intrinsic;
//外部状态
protected  final String extrinsic;

public Flyweight(String extrinsic){
this.extrinsic = extrinsic;
}

//定义业务操作
public abstract void operate();

public void setIntrinsic(String intrinsic){
this.intrinsic = intrinsic;
}

public String getExtrinsic(){
return this.extrinsic;
}

public String getIntrinsic(){
return this.intrinsic;
}
}


package com.pattern.flyweight;

/**
* 具体的享元类,实现具体的操作
* @author yjzhou
*/
public class ConcreteFlyweight extends Flyweight {

public ConcreteFlyweight(String extrinsic) {
super(extrinsic);
}

@Override
public void operate() {
System.out.println(this);
}

@Override
public String toString() {
return super.getIntrinsic()+super.getIntrinsic();
}
}


package com.pattern.flyweight;

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

/**
* 享元工厂类,获取需要的享元对象
* @author yjzhou
*/
public class FlyweightFactory {
//定义一个池容器
private static Map<String,Flyweight> pool = new HashMap<String, Flyweight>();
//享元工厂
public static Flyweight getFlyweight(String extrinsic){
//需要返回的对象
Flyweight flyweight = null;
if (pool.containsKey(extrinsic)){
flyweight = pool.get(extrinsic);
}else{
//根据外部状态创建享元对象
flyweight = new ConcreteFlyweight(extrinsic);
//将对象放到池中
pool.put(extrinsic,flyweight);
}
return flyweight;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息