一,理解
1,书本上的解释:
运用共享技术有效的支持大量细颗粒度的对象
2,自己的看法:
用来减少创建对象的数量,以减少内存占用和提高性能
二,用法:
1,什么时候用?
(1)系统当中有大量的对象
(2)在大量的对象中有很多相似的部分
(3)共享数据对象,且避免多次的实例化
2,如何用?
用关键的代码:其中hashtable需要添加命名:using System.Collections;
主要判断这个对象存不存在,如果存在就返回,若果不存在,就实例化再返回。
private Hashtable flyweights = new Hashtable();
public Company Getwebsite(string key)
{
if (!flyweights.ContainsKey(key))
flyweights.Add(key, new Truecompany(key));
return ((Company)flyweights[key]);
}
3,重点是什么?
用 HashMap 存储这些对象
4,优缺点是什么?
(1)优点:
减少了内存的使用,减少了对象的创建
(2)缺点:
提高了体统的复杂度,需要分类出外部状态和内部状态
5,相关的例子:
抽象一个简单的业务流程:红牛每瓶饮料都会有一个二维码,扫描二维码就知道是否中奖,我们简化二维码为中奖文字,都会在瓶盖上,瓶盖的形状和颜色是可以提取为相似的部分的,然后中奖信息每个瓶盖都不一样,所以为有差异的非共享成员,
6,两个状态:
(1)外蕴状态:
是不可以共享的,它随着环境的改变而改变,因此有客户端进行维持
(2)内蕴状态:
不会随着环境的改变而改变,是可以共享的
三,举例
书上的例子:有很多的公司需要做大致相同的网站,而且每个公司的网站有不同的数据库:
1,用户类,是网站类的外蕴状态:如下
public class User
{
private string name;
public User (string name )
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
2,抽象的网站类:用来传递用户对象:
abstract class Webdite
{
public abstract void Use(User user);
}
3,具体的网站类:是内蕴状态,可以共享
class ConcreteWebdite: Webdite
{
private string name = "";
public ConcreteWebdite(string name)
{
this.name = name;
}
public override void Use(User user )
{
Console.WriteLine("网站分类为:"+name +"用户:"+user.Name );
}
}
4,网站工厂类:用来创建网站不同的对象,并确认是否存在过这个对象,如果存在返回,如果不存在,就创建一个新的实例,并记录有几个对象
class WebSiteFatorory
{
private Hashtable flyweights = new Hashtable();
public Webdite Getwebsite(string key)
{
if (!flyweights.ContainsKey(key))
flyweights.Add(key, new ConcreteWebdite(key));
return ((Webdite)flyweights[key]);
}
public int GetWebSiteCount()
{
return flyweights.Count;
}
}
5,客户端代码:实例化一个工厂
static void Main(string[] args)
{
WebSiteFatorory aa = new WebSiteFatorory();
Webdite enen = aa.Getwebsite("产品展示");
enen.Use(new User("小菜"));
Webdite haha = aa.Getwebsite("产品展示");
enen.Use(new User("啥子"));
Webdite yaya = aa.Getwebsite("博客");
enen.Use(new User("夏红"));
Webdite yuyu = aa.Getwebsite("微信");
enen.Use(new User("相遇"));
Console.WriteLine("得到的网站分类总数为{0}",aa.GetWebSiteCount());
Console.ReadKey();
}