设计模式漫谈之享元模式
今天周六,休息,刚下过雨,有风。
哈哈,像不像古龙的小说。程序员不是机器人,不是国家总理,没有那么忙。而老板讲究的永远是利益,利用,所以当你没利用价值的时候,看老板能闲养你三个月吗?程序员的赚钱工具就是技术,别人无法替代的技术。天天休息不好,失眠,心乱,只能写篇博客静静心。
在面向对象中,每个对象都要占用空间,比如New一个对象,是在堆中分配空间,然后把堆中的引用给这个引用类型。但是不同的对象,虽然空间不同,但是空间中的值是可以相同的。像匿名方法,只用一次,不再用,所以也就没必要起个名字。而有些对象,New后,使用后,可能还会使用,这样的对象应该放在对象池子中。对象从类型上分,可以分不同的类型,从数量上分,可以分单个,多个集合。池子对象就是集合对象。
闲话少说,今天说享元模式,享,享福的意思,共享。元,对象的静态成员,动态成员都是元。
直接上例子,我来解释。
//抽象类,一种接收者
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;
}
}
//参数包装者,对象的关联关系
public class User
{
private string name;
public User(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
//对象的对外接口
WebSiteFactory f = new 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("博客");
fm.Use(new User("桃谷六仙"));
WebSite fn = f.GetWebSiteCategory("博客");
fn.Use(new User("南海鳄神"));
总结,休息不好,没有感情滋养,精神状态不佳。程序员这个职业属于坚持的人,坚持下来的才称得上程序员。下一个目标,工作到2022年,10年开发经验。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?