享元(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)模式的更多相关文章

  1. Java 实现享元(Flyweight)模式

    /** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...

  2. 十二、享元(Flyweight)模式--结构模式(Structural Pattern)

    Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...

  3. 享元(FlyWeight)模式

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...

  4. 设计模式C++描述----12.享元(Flyweight)模式

    一. 概述 在面向对象系统的设计何实现中,创建对象是最为常见的操作. 这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑 ...

  5. python 设计模式之享元(Flyweight)模式

    #写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...

  6. 十一、结构模式之享元(Flyweight)模式

    什么是享元模式 享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象.享元对象能做到共享的关键是区分内蕴状态和外蕴状态.一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同 ...

  7. Java设计模式:Flyweight(享元)模式

    概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...

  8. 设计模式(11)--Flyweight(享元模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...

  9. Flyweight 享元模式 MD

    享元模式 简介 在JAVA语言中,String类型就是使用了享元模式,JAVA中的字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝,避免了在创建N多相同对象时所产生的不 ...

随机推荐

  1. the road of app test

    移动互联网测试——你应该要掌握的技能树 http://www.stuq.org/news/488 手机类型native app,hybrid app,web app http://www.uisdc. ...

  2. 关于Homebrew出现GitHub API rate limit错误的解决方法

    参考博文: http://havee.me/mac/2013-12/how-to-install-and-use-homebrew.html Error: GitHub API rate limit ...

  3. [三卷天书]ajax请求时接收到乱码的处理方案

    $.ajax({ url: "getmore.ashx", type: "post", dataType: "text", data: { ...

  4. FPGA与嵌入式一点见解

    FPGA:即现场可编程门阵列,它是在PAL.GAL.CPLD等可编程器件的基础上进一步发展的产物.它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可 ...

  5. Java中判断非空对象.

    Java中经常会遇到判断非空的时候. 有的时候判断了非空但是还是报空指针,为什么.? 判断的时候一般都会判断两次.类似于: Org o = new Org(); if ( o.getId()!=nul ...

  6. 【转】使用JMeter 完成常用的压力测试(一)

    本文介绍了 JMeter 相关的基本概念.并以 JMeter 为例,介绍了使用它来完成最常用的三种类型服务器,即 Web服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项. 讲到测试, ...

  7. 求分数1+1/2+1/3+.....+1/n的值

    总结:自己理解错了的有以下几点: 1.s初始化的值是0.但数据类型最好定位double双精度类型 2.for循环里面的i<n.不要忘了等号,因为i作为分母,不能为0,所以从1开始, 3.在mai ...

  8. fatal: read error: Connection reset by peer解决办法

    标签(空格分隔): ceph源码安装,git 问题描述: 源码安装ceph,克隆代码时提示如下错误: [root@localhost ~]# git clone git://github.com/ce ...

  9. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

  10. Docker构建ssh镜像

    FROM ubuntu MAINTAINER ggzone xxx@live.com ENV REFRESHED_AT 2015-10-21 RUN apt-get -qqy update & ...