第26章 项目多也别傻做——享元模式
¥:度娘:¥[享元模式](Flyweight Pattern(|ˈpætn| noun 图案))是一种软件¥[设计模式]。它使用共享物件,用来尽可能¥[减少内存使用量]以及分享资讯给尽可能多的相似物件;它适用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享,常见的做法是把它们放在外部数据结构中(例如把这些可分享的部分存储在缓存池中),当需要使用时再将它们传递给¥[享元]。
¥:如果一个应用程序使用了大量的相似对象,而这些对象造成了很大的存储开销的时候就可以考虑是否使用享元模式。例如,如果发现某个对象生成了大量细粒度的实例,并且这些实例除了几个参数外基本是¥[相同的],如果把那些共享参数移到类外面,在方法调用时将他们传递进来,就可以通过共享大幅度减少内存使用量。
¥:享元模式中所谓的内部状态指的是存储在享元内部,不会随着环境的改变而有所不同,是可以¥[共享]的。所谓外部状态指的是不可以共享的,它随环境的改变而改变,因此外部状态是由客户端来保持(因为环境的变化是由客户端引起的)。
¥:iOS设计模式解析:享元模式(Flyweight pattern),实现¥[享元模式]需要两个关键组件,通常是可共享的享元和保存它们的池。
¥:iOS设计模式解析:享元模式:运用共享技术有效地支持大量¥[细粒度]的对象。满足以下条件时可考虑使用享元模式:
1:应用程序使用很多对象。
2:在内存中保存对象会影响¥[内存]性能。
3:对象的多数特有状态(外在状态)可以放倒外部而轻量化。
4:移除了外在状态之后,可以用较少的共享对象替代原来的那组对象。
5:应用程序不依赖于对象标识,因为共享对象不能提供唯一的标识。
¥:大话设计模式:¥[享元模式](Flyweight),运用共享技术有效地支持大量¥[细粒度]的对象。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数基本上都是相同的,有时就能够大幅度减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。
¥:大话设计模式:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态都是内部状态,那么就可以用相对较少的共享对象取代很多组对象,此时可以考虑使用¥[享元模式]。
website noun 网址
extrinsic |ekˈstrɪnsɪk| adjective 外在的 外部的、extrinsic state 外部状态
26.1 项目多也别傻做
//网站
class WebSite
{
private string name = “”;
public WebSite(string name)
{
this.name = name;
}
public void Use()
{
Console.WriteLine(“网站分类:”+name);
}
}
//客户端代码
static void Main(string[] args)
{
WebSite fx = new WebSite(“产品展示”);
fx.Use();
WebSite fy = new WebSite(“产品展示”);
fy.Use();
WebSite fz = new WebSite(“产品展示”);
fz.Use();
WebSite f1 = new WebSite(“博客”);
f1.Use();
WebSite f2 = new WebSite(“博客”);
f2.Use();
WebSite f3 = new WebSite(“博客”);
f3.Use();
Console.Read();
}
26.2 享元模式
Flyweight类,它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。
abstract class Flyweight
{
public abstract void Operation(int extrinsicstate);
}
ConcreteFlyweight是继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间
class ConcreteFlyweight : Flyweight
{
public override void Operation(int extrinsicstate)
{
Console.WriteLine(“具体Flyweight”+ extrinsicstate);
}
}
UnsharedConcreteFlyweight是指那些不需要共享的Flyweight子类。因为Flyweight接口共享成为可能,但他并不强制共享。
class UnsharedConcreteFlyweight : Flyweight
{
public override void Operation(int extrinsicstate)
{
Console.WriteLine(“不共享的具体Flyweight”+ extrinsicstate);
}
}
FlyweightFactory,是一个享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享Flyweight,当用户请求一个Flyweight是,FlyweightFactory对象提供了一个已经创建的实例或者创建一个(如果不存在)
class FlyweightFactory
{
private Hashtable flyweights = new Hashtable();
public FlyweightFactory()
{
flyweights.Add(“X”,new ConcreteFlyweight());
flyweights.Add(“Y”,new ConcreteFlyweight());
flyweights.Add(“Z”,new ConcreteFlyweight());
}
public Flyweight GetFlyweight(string key)
{
return ((Flyweight)flyweights[key]);
}
}
客户源代码
static void Main(string[] args)
{
int extrinsicstate = 22;
FlyweightFactory f = new FlyweightFactory();
Flyweight fx = f.GetFlyweight(“X”);
fx.Operation(- -extrinsicstate);
Flyweight fy = f.GetFlyweight(“Y”);
fy.Operation(- -extrinsicstate);
Flyweight fz = f.GetFlyweight(“Z”);
fz.Operation(- -extrinsicstate);
Flyweight uf = new UnsharedConcreteFlyweight();
uf.Operation(- -extrinsicstate);
Console.Read();
}
26.3 网站共享代码
//网站抽象类
abstract class WebSite
{
public abstract void Use();
}
//具体网站类
class ConcreteWebSite:WebSite
{
private string name = “”;
public ConcreteWebSite(string name)
{
this.name = name;
}
public override void Use()
{
Console.WriteLine(“网站分类:” + name);
}
}
//网站工厂类
using System.Collections;
//网站工厂
class WebSiteFactory
{
private Hashtable flyweights = new Hashtable();
//获得网站分类
public WebSite GetWebSiteCategory(string key)
{
if(!flyweights.ContainsKey(key))
{
flyweights.Add(key,new ConcreteWebSite(key));
}
return ((WebSite)flyweights[key]);
}
//获得网站分类总数
public int GetWebSiteCount()
{
return flyweights.Count;
}
}
客户端代码
static void Main(string[] args)
{
WebSiteFactory f = WebSiteFactory();
WebSite fx = f.GetWebSiteCategory(“产品展示”);
fx.Use();
WebSite fy = f.GetWebSiteCategory(“产品展示”);
fy.Use();
WebSite fz = f.GetWebSiteCategory(“产品展示”);
fz.Use();
WebSite fl = f.GetWebSiteCategory(“博客”);
fl.Use();
WebSite fm = f.GetWebSiteCategory(“博客”);
fn.Use();
WebSite fm = f.GetWebSiteCategory(“博客”);
fn.Use();
Console.WriteLine(“网站分类总数{0}”,f.GetWebSiteCount());
Console.Read();
}
26.4 内部状态和外部状态
//用户
public class User
{
private string name;
public User(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
网站抽象类
abstract class WebSite
{
public abstract void Use(User user);
}
具体网站类
class ConcreteWebSite : WebSite
{
private string name = “”;
public ConcreteWebSite(string name)
{
this.name = name;
}
public override void Use(User user)
{
Console.WriteLine(“网站分类:” + name + “用户:” + user.Name);
}
}
//网站工厂类
class WebSiteFactory
{
private Hashtable flyweights = new Hashtable();
//获得网站分类
public WebSite GetWebSiteCategory(string key)
{
if(!flyweights.ContainsKey(key))
{
flyweights.Add(key,new ConcreteWebSite(key));
}
return ((WebSite)flyweights[key]);
}
//获得网站分类总数
public int GetWebSiteCount()
{
return flyweights.Count;
}
}
static void Main(string[] args)
{
WebSiteFactory f = WebSiteFactory();
WebSite fx = f.GetWebSiteCategory(“产品展示”);
fx.Use(new User(“小菜”));
WebSite fy = f.GetWebSiteCategory(“产品展示”);
fy.Use(new User(“大鸟”));
WebSite fz = f.GetWebSiteCategory(“产品展示”);
fz.Use(new User(“娇娇”));
WebSite fl = f.GetWebSiteCategory(“博客”);
fl.Use(new User(“老顽童”));
WebSite fm = f.GetWebSiteCategory(“博客”);
fn.Use(new User(“桃谷六仙”));
WebSite fm = f.GetWebSiteCategory(“博客”);
fn.Use(new User(“南海神鳄”));
Console.WriteLine(“网站分类总数{0}”,f.GetWebSiteCount());
Console.Read();
}