一、产生背景

  享元模式:它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

之前讲到的单例模式,一个类只有一个唯一的对象,也就是说,不管new多少次,只需要创建这个类的一个对象,如果不采用单例模式,每new一次,就会创建一个对象,便会产生大量重复的对象,而这些对象要消耗很大的资源的时候,是会产生资源互抢的延迟的。这个时候享元模式就能帮忙解决这类的问题。

二、一般做法

享元模式就是把部分和整体的关系用树形结构来表示,从而使客户端能够把一个个的部分对象和由它们组合起来的整体对象采用同样的方式来对待。享元模式主要由3部分组成:享元类,具体的享元类,享元工厂类。

三、实例

抽象享元类

    /// <summary>
/// 抽象享元类,提供具体享元类具有的方法
/// </summary>
public abstract class Flyweight
{
public abstract void Operation();
}

具体享元类

    /// <summary>
/// 具体的享元对象
/// </summary>
public class ConcreteFlyweight : Flyweight
{
private string intrinsicstate; // 构造函数
public ConcreteFlyweight(string innerState)
{
this.intrinsicstate = innerState;
}
/// <summary>
/// 享元类的实例方法
/// </summary>
/// <param name="extrinsicstate">外部状态</param>
public override void Operation()
{
Console.WriteLine("调用了具体的对象: {0}", intrinsicstate);
}
}

享元工厂

    /// <summary>
/// 享元工厂,负责创建和管理享元对象
/// </summary>
public class FlyweightFactory
{
public List<Flyweight> flyweights = new List<Flyweight>(); public FlyweightFactory()
{
flyweights.Add(new ConcreteFlyweight("第一个对象"));
flyweights.Add(new ConcreteFlyweight("第二个对象"));
flyweights.Add(new ConcreteFlyweight("第三个对象"));
} public Flyweight GetFlyweight(int key)
{
Flyweight flyweight;
if (key >= flyweights.Count)
{
Console.WriteLine("驻留池中不存在对象" + (key + ));
flyweight = new ConcreteFlyweight("第" + (key + ) + "个对象");
}
else
{
flyweight = flyweights[key];
}
return flyweight;
}
}

客户端调用

        static void Main(string[] args)
{
// 初始化享元工厂
FlyweightFactory factory = new FlyweightFactory(); // 判断是否已经创建了对象1,如果已经创建就直接使用创建的对象
Flyweight fa = factory.GetFlyweight();
if (fa != null)
{
// 把外部状态作为享元对象的方法调用参数
fa.Operation();
}
// 判断是否已经创建了字母B
Flyweight fb = factory.GetFlyweight();
if (fb != null)
{
fb.Operation();
}
// 判断是否已经创建了字母C
Flyweight fc = factory.GetFlyweight();
if (fc != null)
{
fc.Operation();
}
// 判断是否已经创建了字母D
Flyweight fd = factory.GetFlyweight();
if (fd != null)
{
fd.Operation();
}
else
{
Console.WriteLine("驻留池中不存在对象4");
// 这时候就需要创建一个对象并放入驻留池中
ConcreteFlyweight d = new ConcreteFlyweight("第四个对象");
factory.flyweights.Add(d);
} Console.Read();
}

四、设计模式分析

缺点:

一、

为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑更复杂,使系统复杂化。

二、

享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

设计模式のFlyweight(享元模式)----结构模式的更多相关文章

  1. C++设计模式-Flyweight享元模式

    Flyweight享元模式 作用:运用共享技术有效地支持大量细粒度的对象. 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intrins ...

  2. 设计模式(十二): Flyweight享元模式 -- 结构型模式

    说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...

  3. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

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

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

  5. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

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

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

  7. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  8. 设计模式之flyweight享元模式

    运用共享技术支持大量细粒度对象的使用 Flyweight模式(享元) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模 ...

  9. 设计模式:享元(FlyWeight)模式

    设计模式:享元(FlyWeight)模式 一.前言     享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...

  10. 设计模式11: Flyweight 享元模式(结构型模式)

    Flyweight 享元模式(结构型模式) 面向对象的代价 面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能.但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系 ...

随机推荐

  1. 3. 原子变量-CAS算法

    1. 是什么 ? 2. CAS算法模拟 package com.gf.demo03; public class TestCompareAndSwap { public static void main ...

  2. Java学习笔记之——Object类

    所有类的祖先 如果一个类没有显式继承,则继承Object 每一个类都直接或间接的是Object的子类 相关API: protected Objectclone() 创建并返回此对象的副本. boole ...

  3. HTML 介绍及标签

    HTML htyper text markup language 即超文本标记语言 超文本: 就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 标记语言: 标记(标签)构成的语言. 标签 ...

  4. vue从入门到进阶:自定义指令directive,插件的封装以及混合mixins(七)

    一.自定义指令directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的 ...

  5. 洛谷P4726 【模板】多项式指数函数(多项式exp)

    题意 题目链接 Sol 多项式exp,直接套泰勒展开的公式 \(F(x) = e^{A(x)}\) 求个导\(F'(x) = A(x)\) 我们要求的就是\(G(f(x)) = lnF(x) - A( ...

  6. spring boot maven打包可运行jar包

    普通打包之后在程序目录运行,或者编写bat运行时会提示“没有主清单属性”,这是因为并没有找到main()方法,需要我们指明告诉java程序 我bat中的代码 @echo off title mytit ...

  7. jQuery 简单案例

    案例一:全选.反选.取消实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  8. 【vue】使用vue构建多页面应用

    先了解一些单页面和多页面的区别 mm 多页应用模式MPA 单页应用模式SPA 应用构成 由多个完整页面构成 一个外壳页面和多个页面片段构成 跳转方式 页面之间的跳转是从一个页面跳转到另一个页面 页面片 ...

  9. Python 利用Python操作excel表格之openyxl介绍Part1

    利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436),免费获取以下性能监控工具(类似Nmon精简版) ...

  10. 根据标签中动态获取的值绑定特定的class

    数据有mock数据获取 mock文件: index文件: 引入文件index: 获取数据函数: 根据获取的标签内容给定不同的样式: