享元(Flyweight)模式
享元(Flyweight)模式:运用共享技术有效的支持大量细粒度的对象。
/*
* 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。
那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。
* 具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。
享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。
* 享元工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。
当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。
如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。
* 客户端(Client)角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。
*/
享元模式,当你使用的是相同对象的时候,就直接使用已经存在的对象,不用再去创建一个相同的对象。
一个咖啡店例子
抽象享元(Flyweight):Order 提供对咖啡的一些动作
具体享元(ConcreteFlyweight):Flavor 实现卖咖啡,以及返回咖啡名称。GetFlavor() GetFlavor();
享元工厂(FlyweightFactory): FlavorFactory则对咖啡进行判断,如果重复的咖啡,就没必要新建,只要在类型上数量相加就好。所以方法返回的是一个共享的 具体享元角色。
Console.WriteLine("\n=====咖啡销售机=====\n");
flavorFactory = new FlavorFactory(); TakeOrder("Black Coffee");
TakeOrder("Capucino");
TakeOrder("Espresso");
TakeOrder("Capucino");
TakeOrder("Espresso");
TakeOrder("Black Coffee");
TakeOrder("Espresso");
TakeOrder("Espresso");
TakeOrder("Black Coffee");
TakeOrder("Capucino");
TakeOrder("Capucino");
TakeOrder("Black Coffee");
Console.WriteLine("\n 总共卖出多少份 : " + ordersMade);
Console.WriteLine("\n 风格品种 : " + flavorFactory.GetTotalFlavorsMade()); private static void TakeOrder(string aFlavor)
{
Order o = flavorFactory.GetOrder(aFlavor);
// 将咖啡卖给客人
o.Serve();
ordersMade++;
} /// <summary>
/// 抽象享元(Flyweight)角色
/// </summary>
public abstract class Order
{
// 将咖啡卖给客人
public abstract void Serve();
// 返回咖啡的名字
public abstract string GetFlavor();
} /// <summary>
/// 具体享元(ConcreteFlyweight)角色
/// </summary>
public class Flavor : Order
{
private string flavor; // 构造函数,内蕴状态以参数方式传入
public Flavor(string flavor)
{
this.flavor = flavor;
} // 返回咖啡的名字
public override string GetFlavor()
{
return this.flavor;
} // 将咖啡卖给客人
public override void Serve()
{
Console.WriteLine("卖出咖啡- " + flavor);
}
} /// <summary>
/// 享元工厂(FlyweightFactory)角色
/// </summary>
public class FlavorFactory
{
private Hashtable flavors = new Hashtable(); public Order GetOrder(string key)
{
if (!flavors.ContainsKey(key))
flavors.Add(key, new Flavor(key)); return ((Order)flavors[key]);
} public int GetTotalFlavorsMade()
{
return flavors.Count;
}
}
基本代码:
//变量赋值
int extrinsicstate = ; FlyweightFactory f = new FlyweightFactory(); // 使用不同的轻量级选手实例
Flyweight fx = f.GetFlyweight("X");
fx.Operation(--extrinsicstate); Flyweight fy = f.GetFlyweight("Z");
fy.Operation(--extrinsicstate); Flyweight fz = f.GetFlyweight("Y");
fz.Operation(--extrinsicstate);
/// <summary>
/// 抽象享元(Flyweight)角色
/// </summary>
public abstract class Flyweight
{
// 方法
public abstract void Operation(int extrinsicstate);
} /// <summary>
/// 具体享元(ConcreteFlyweight)角色
/// </summary>
public class ConcreteFlyweight : Flyweight
{
private string intrinsicstate = "A"; public override void Operation(int extrinsicstate)
{
Console.WriteLine("ConcreteFlyweight1: 级别- {0}, 编号- {1}", intrinsicstate, extrinsicstate);
} }
/// <summary>
/// 具体享元(ConcreteFlyweight)角色
/// </summary>
public class ConcreteFlyweight2 : Flyweight
{
private string intrinsicstate = "B"; public override void Operation(int extrinsicstate)
{
Console.WriteLine("ConcreteFlyweight2: 级别- {0}, 编号- {1}", intrinsicstate, extrinsicstate);
} } /// <summary>
/// 享元工厂(FlyweightFactory)角色
/// </summary>
public class FlyweightFactory
{
private Hashtable flyweights = new Hashtable(); // 构造函数
public FlyweightFactory()
{
flyweights.Add("X", new ConcreteFlyweight());
flyweights.Add("Y", new ConcreteFlyweight2());
flyweights.Add("Z", new ConcreteFlyweight());
} // 方法
public Flyweight GetFlyweight(string key)
{
return ((Flyweight)flyweights[key]);
}
}
享元(Flyweight)模式的更多相关文章
- Java 实现享元(Flyweight)模式
/** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...
- 十二、享元(Flyweight)模式--结构模式(Structural Pattern)
Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...
- 享元(FlyWeight)模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...
- 设计模式C++描述----12.享元(Flyweight)模式
一. 概述 在面向对象系统的设计何实现中,创建对象是最为常见的操作. 这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑 ...
- python 设计模式之享元(Flyweight)模式
#写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...
- 十一、结构模式之享元(Flyweight)模式
什么是享元模式 享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象.享元对象能做到共享的关键是区分内蕴状态和外蕴状态.一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同 ...
- Java设计模式:Flyweight(享元)模式
概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...
- 设计模式(11)--Flyweight(享元模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...
- Flyweight 享元模式 MD
享元模式 简介 在JAVA语言中,String类型就是使用了享元模式,JAVA中的字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝,避免了在创建N多相同对象时所产生的不 ...
随机推荐
- 关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题
为了能够在工作中方便的应用OPC和充分的理解OPC的开发流程.内部机制,这两天正在研究开发OPC客户端程序,一般我们开发OPC客户端程序有以下几种方式: (1) 使用OPCNetAPI,需 ...
- Oracle 数据库备份还原(Expdp/impdp)记录
最近公司将原数据库服务器切换.之前没整过这块,也是一堆的度娘.经过不停的摸索,终于成功了.现在将这份艰辛记录下来,方便自己以后查阅的同时,方便有类似需求的同学参考. 我们此次切换共分:ERP.LOS. ...
- git 基本操作 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000
1.创建版本库 (即仓库 repository)简单理解为一个目录,这个目录里的所有文件都可以被git管理起来,每个文件的修改删除,git都能跟踪,一边任何时刻都可以追踪历史,或者在将来某个时刻可以 ...
- java代码实现鼠标双击出现画图-----------paint()方法由系统自动调用,且一定是小写的字母p
总结:在运行过程中,自己不是很认真,没有检查自己写的代码,结果是无论你怎么运行,双击 frame都没用,因为系统根本就没有调用paint()方法绘图.所以很重要的是实现这个方法 package com ...
- java代码----求最大值,平均值。。。
总结:方法的返回值----返回的对象到底是什么? package com.a; import java.util.Scanner; //从键盘输入10个数,并输出最大值,最小值,平均值 public ...
- 几种经典的hash算法
计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很 ...
- 分布式锁之三:mysql实现-待整理
下面我们来看下开源dubbo推荐的业界成熟的zookeeper做为注册中心, zookeeper是hadoop的一个子项目是分布式系统的可靠协调者,他提供了配置维护,名字服务,分布式同步等服务.对于z ...
- win10 Edge 无法上网代理服务器错误
当连接好网络时 Edge无法上网,提示代理服务器错误,系统其他非第三方软件同样网络异常 解决:为当前所连接的网络更新自动检测 控制面板->网络和Internet->Internet选项-& ...
- log4net 使用总结- (2)在ASP.NET MVC 中使用
log4net在ASP.NET MVC中的配置,还有一种配置方式,即不在web.config中,而是单独新建一个log4net.config 在根目录下 第一.引用log4net.dll 第二 ...
- 字符串,字符数组(C/C++)
这个地方困惑我好久了,废话不多说 char c1[]="12345"; char *c2="12345"; string c3="12345" ...