一、产生背景

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

之前讲到的单例模式,一个类只有一个唯一的对象,也就是说,不管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. junit 测试报错 java.lang.Exception: No runnable methods

    转自:http://blog.csdn.net/snails_zx/article/details/51275894 在maven 项目中  建立测试类时,基类只用作加载spring配置文件,里面没有 ...

  2. 在JS方法中返回多个值的三种方法(转载)

    来源:https://www.cnblogs.com/gxsyj/p/6004574.html 在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数 ...

  3. SpringBoot 配置 Servlet、Filter、Listener

    SpringBoot 配置 Servlet.Filter.Listener 在SpringBoot应用中,嵌入式的 Servlet 3.0+ 容器不会直接使用 ServletContainerInit ...

  4. Netty实战十一之预置的ChannelHandler和编解码器

    Netty为许多通用协议提供了编解码器和处理器,几乎可以开箱即用,这减少了你在那些相当繁琐的事务上本来会花费的时间与精力.我们将探讨这些工具以及它们所带来的好处,其中包括Netty对于SSL/TLS和 ...

  5. java安全管理器SecurityManager介绍

    java安全管理器类SecurityManager简单剖析: javadoc介绍: SecurityManager是一个允许应用实现一种安全策略的类.它允许一个应用去明确,在执行一个可能安全或者敏感的 ...

  6. Ubuntu 安装 chrome

    依次执行命令: sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ wget - ...

  7. angular 分页插件的使用

    html: <pagination total-items="totalItems" ng-model="currentPage" items-per-p ...

  8. python爬虫学习记录——各种软件/库的安装

    Ubuntu18.04安装python3-pip 1.apt-get update更新源 2,ubuntu18.04默认安装了python3,但是pip没有安装,安装命令:apt install py ...

  9. Apache Windows下Apache安装步骤

    1.apache官网下载Apache HTTP Server服务器 我相信有些朋友刚用apache服务器时,都希望从官网上下载,而面对着官网上众多的项目和镜像以及目录,也许有点茫然.下面是具体步骤: ...

  10. Symantec Backup Exec Agent 推送错误Error connecting to the remote computer. Ensure that the computer is available, has WMI enabled and is not blocked by a firewall

    如果在Symantec Backup Server上推送Symantec Backup Exec Agent到数据库服务器遇到“"Error connecting to the remote ...