四. 享元模式应用之QQ聊天
我们不妨假设QQ是在服务器端将每次的对话都抽象出来形成了一个类。于是代 码如下:
class People
{
private string name;
private int age;
public string Name
{
get
{
return name;
}
}
public int Age
{
get
{
return age;
}
set
{
age = value;
}
}
public People(string
p1, People p2)
{
this.boy = p1;
this.girl = p2;
}
public string ChatContent
{
get
{
return chatContent;
}
set
{
chatContent = value;
}
}
public People Boy
{
get
{
return boy;
}
}
public People Girl
{
get
{
return girl;
}
}
}
若每次二者聊天时均将Chat实例化为一个对象,如下:
class Program
{
static void Main(string[] args)
{
People boy=new
People("PrettyBoy",20);
People girl=new
People("BeautifulGirl",18);
Chat chat = new
Chat(boy, girl);
chat.ChatContent = "I love you";
ChatServer.Send(chat);
}
}
若如此,服务器就需要每次都去初始化一个对象,而当chatServer将此次聊天的记录发 送给客户机之后,这个对象便成了垃圾对象。这样,每小时几百万的聊天次数,便有了几百万的对象垃 圾。垃圾回收器GC便需要不停地去工作,回收对象。
这就对效率产生了极大的影响。于是,我们想办法,使用享元模式来解决这个 问题。
两者聊天,他们的聊天方是不变的,因此,我们可以在服务器端去维护一个这样的Chat 对象集合,如果该聊天对象已经存在,那么我们便重复去利用这个聊天对象。这样既减少了内存垃圾, 又节省了创建对象的时间。
代码如下:
class
static ObjectCache()
{
cache = new Dictionary<Type, Object>();
}
public bool TryToGetObejct<T>(out T item, out bool
increasable) where T : class,IPoolable, new()
{
TryToAddObject<T>();
return (cache[typeof(T)] as SizeRestrictedList<T>).
Acquire(out
item, out increasable);
}
private void TryToAddObject<T>() where T:class,
IPoolable,new()
{
if (!cache.ContainsKey(typeof(T)))
{
cache.Add(typeof(T), new SizeRestrictedList<T>());
}
}
}
public bool Acquire(out T item, out bool
=============== 1、 Order.java
package flyweight;
public abstract class Order {
//执行卖出动作
public abstract void sell();
//获取咖啡口味
public abstract String getFlavor();
}
=============== 1 end
=============== 2、 FlavorOrder.java
package flyweight;
public class FlavorOrder extends Order{
private String flavor;
public FlavorOrder(String flavor){
this.flavor = flavor;
}
public String getFlavor(){
return this.flavor;
}
public void sell(){
System.out.println("卖出一杯 [" + flavor + "]。" );
}
}
=============== 2 end
=============== 3、 FlavorFactory.java
package flyweight;
import java.util.HashMap;
import java.util.Map;
public class FlavorFactory {
//订单池
private Map<String,Order> flavorPool = new HashMap<String,Order>(20);
//静态工厂,负责生成订单对象
private static FlavorFactory flavorFactory = new FlavorFactory();
private FlavorFactory() {}
public static FlavorFactory getInstance() {
return flavorFactory;
}
//获得订单
public Order getOrder(String flavor) {
Order order = null;
if(flavorPool.containsKey(flavor)){
order = flavorPool.get(flavor);
}else{
//获得新口味订单
order = new FlavorOrder(flavor);
//放入对象池
flavorPool.put(flavor, order);
}
return order;
}
//获得已经卖出的咖啡全部口味数量
public int getTotalFlavorsMade() {
return flavorPool.size();
}
}
=============== 3 end