定义:运用共享技术有效支持大量细粒度的对象
有一个享元工厂,用来创建并管理flyweight对象。它主要是确保合理共享flyweight,当用户请求一个flyweight时,flyweight工厂对象提供一个已知创建的实例或者创建一个
内部状态和外部状态:
在享元对象内部并且不会随环境变化而变化的共享状态,是享元对象的内部状态
随环境改变而改变的,不可以共享的状态是外部状态
使用情景:
如果一个应用程序使用了大量的对象,而大量对象造成了很大的存储开销;对象的大多数状态可以用外部状态,如果删除对象外部,那么可以用相对较少的共享对象取代很多组对象
e.g. String的存储
using System; using System.Collections.Generic; using System.Collections; using System.Text; namespace 享元模式 { class Program { public class Student { private string name; public Student(string name) { this.name = name; } public string Name { get { return name; } } } abstract class Paper { public abstract void Read(Student student); } class ConcretePaper:Paper { private string name = ""; public ConcretePaper(string name) { this.name = name; } public override void Read(Student stu) { Console.WriteLine("paper class: " + name + " stu: " + stu.Name); } } class PaperFactory { private Hashtable stuMap = new Hashtable(); public Paper GetPaperClass(string key) { if (!stuMap.ContainsKey(key)) stuMap.Add(key, new ConcretePaper(key)); return ((Paper)stuMap[key]); } public int GetPaperCount() { return stuMap.Count; } } static void Main(string[] args) { PaperFactory f = new PaperFactory(); Paper x = f.GetPaperClass("xxx"); x.Read(new Student("01")); Paper y = f.GetPaperClass("yyy"); y.Read(new Student("02")); Paper z = f.GetPaperClass("xxx"); z.Read(new Student("03")); Paper a = f.GetPaperClass("yyy"); a.Read(new Student("04")); Paper b = f.GetPaperClass("xxx"); b.Read(new Student("05")); Paper c = f.GetPaperClass("yyy"); c.Read(new Student("06")); Console.WriteLine("classCount:" + f.GetPaperCount()); Console.Read(); } } }
paper class: xxx stu: 01
paper class: yyy stu: 02
paper class: xxx stu: 03
paper class: yyy stu: 04
paper class: xxx stu: 05
paper class: yyy stu: 06
classCount:2