面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?
享元模式:运用共享技术有效的支持大量细粒度的对象
结构图:
解释:
- FlyweightFactory:一个享元工厂,用来创建并管理Flyweight对象,它主要是用来确保合理的共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)
- Flyweight:所有具体享元类的超类或接口,通过这个接口,Flyweight尅接受并作用于外部状态
- ConcreteFlyweight:继承Flyweight超累或实现Flyweight接口,并为内部状态增加储存空间
- UnsharedConcreteFlyweight:指那些不需要共享的Flyweight子类,因为Flyweight接口共享成为可能,但它并不强制共享
代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace 享元模式
{
class Program
{
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();
}
}
//Flyweight 类,它是所有具体享元类的超类或接口
abstract class Flyweight
{
public abstract void Operation(int extrinsicstate);
}
//ConcreteFlyweight类,继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间
class ConcreteFlyweight : Flyweight
{
public override void Operation(int extrinstate)
{
Console.WriteLine("具体Flyweight:" + extrinstate);
}
}
//UnsharedConcreteFlyweight类,代表那些不需要共享的Flyweight子类
class UnsharedConcreteFlyweight : Flyweight
{
public override void Operation(int extrinsicstate)
{
Console.WriteLine("不共享的具体Flyweight:" + extrinsicstate);
}
}
//FlyweightFactory类,是一个享元工厂,用来创建并管理Flyweight对象
class FlyweightFactory
{
//使用Hashtable需要调用using System.Collections;
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]);
}
}
}
例子:网站共享
结构图:
代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace 网站共享代码
{
class Program
{
static void Main(string[] args)
{
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("唐欢"));
Console .WriteLine ("得到网站分类总数为{0}",f.GetWebSiteCount ());
Console.Read();
}
}
//用户类 ,用于网站的客户账号,是“网站”类的外部状态
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 ;
}
}
}
运行结果:
享元模式的应用
- 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时
- 当对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代多组对象
享元模式的优点:
- 实例总数少了
- 共享的对象越多,存储节约也就越多,节约量随着共享状态的增多而增大
分享到:
相关推荐
大话设计模式之外观模式 经典代码 C#类
享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - ...
Android之大话设计模式——:抽象工厂模式借鉴.pdf
android之大话设计模式.pdf
大话设计模式源代码之简单工厂模式 经典代码
《大话设计模式》对各种设计模式,做简要归纳(原创)
android之大话设计模式整理.pdf
大话设计模式之代理模式 经典代码 C#类
树懒自己整理的大话设计模式的修行笔记,对程序设计有很大的帮助,主要是以自己学习的习惯整理的!
大话设计模式源代码之策略模式 经典代码 C#类
设计模式之《大话设计模式》.pptx
大话设计模式 完整设计模式介绍
NULL 博文链接:https://helei050.iteye.com/blog/2086309
大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf
NULL 博文链接:https://linxingliang.iteye.com/blog/1217811
大话设计模式之小菜编程成长记 一本不错的设计模式入门书籍
本文实例讲述了Python设计模式之享元模式原理与用法。分享给大家供大家参考,具体如下: 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象. 下面是一个享元模式的demo: #!/usr/bin/env python...
本资源为 "大话西游之设计模式_从猴王学艺看Decorator "文章的配套代码,通过该代码,可以更加清晰的了解Decorator模式的使用场景
这是之前上传的大话设计模式书籍的对应程序,欢迎下载和阅读 这是之前上传的大话设计模式书籍的对应程序,欢迎下载和阅读