1 问题
面向对象语言的原则就是一切都是对象,但是如果真正使用起来,
有时对象数可能显得很庞大,比如,字处理软件,
如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,
那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,
封装可以被共享的类,另外,还有一些特性是取决于应用(context),
是不可共享的,
这也Flyweight中两个重要概念内部状态intrinsic和外部状态extrinsic之分.
2 代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace Flyweight{
public class Flyweight{
private string _instrinsicState;
public Flyweight(string instrinsicState){
this._instrinsicState = instrinsicState;
}
public virtual void operation(string extrinsicState){}
public string getInstrinsicState(){
return this._instrinsicState;
}
}
public class ConcerteFlyweight : Flyweight{
public ConcerteFlyweight(string instrinsicState):base(instrinsicState){
Debug.Log("ConcerteFlyweight Build.....");
}
public override void operation(string extrinsicState){
Debug.Log("ConcreteFlyweight 内蕴:" + getInstrinsicState() + "外 蕴 :" + extrinsicState);
}
}
public class FlyweightFactory{
private List<Flyweight> listFly;
public Flyweight getFlyweight(string key){
foreach(Flyweight fly in listFly){
if(fly.getInstrinsicState().Equals(key)){
return fly;
}
}
return null;
}
public void addFlyweght(Flyweight fly){
if(null == listFly){
listFly = new List<Flyweight>();
}
if(null != listFly){
listFly.Add(fly);
}
}
}
public class FlyweightDemo : MonoBehaviour {
//享元模式
void Start(){
Flyweight fly = new ConcerteFlyweight("flyweight0");
FlyweightFactory flyweightFactory = new FlyweightFactory();
flyweightFactory.addFlyweght(fly);
Flyweight fly0 = flyweightFactory.getFlyweight("flyweight0");
fly0.operation("extra");
}
}
}
3 总结