享元模式: 以共享的方式高效地支持大量的细粒度对象。

享元对象的状态:
 
  1:内蕴状态(Internal State)内蕴状态存储在享元对象内部且不会随环境改变而改变。因此内蕴状态并可以共享。

2:外蕴状态(External State)。外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态与内蕴状态是相互独立的。

享元模式的应用条件:

1: 一个系统有大量的对象。

2:这些对象耗费大量的内存。

3:这些对象的状态中的大部分都可以外部化。

4:这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。

5:软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

.NET的享元模式:
 
  .NET中的String类型就是运用了享元模式。.NET中如果第一次创建了一个字符串对象s1,下次再创建相同的字符串s2时只是把它的引用指向s1所引用的具体对象,这就实现了相同字符串在内存中的共享。

在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作,运用共享技术有效地支持大量细粒度的对象。

私有属性是元素特有的,可以通过传递参数来进行赋值,而公共属性则通过继承来赋予相应的值:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace FlyWeightPatternSam
 6 {
 7     public abstract class Employer
 8     {
 9         protected string _company = "COMPANY";//公共属性
10         protected string _companyAddress = "ADDRESS";//公共属性
11 
12         public abstract void SetPropertity(string name,string age);
13         public abstract void ShowInformation();
14 
15     }
16 }
17 
18 using System;
19 using System.Collections.Generic;
20 using System.Text;
21 
22 namespace FlyWeightPatternSam
23 {
24     public class EmployerA:Employer 
25     {
26         private string _name;//特有属性
27         private string _age;
28         private string _id="01";
29         public override void SetPropertity( string name, string age)
30         {//传递相应的参数来赋值
31             //throw new Exception("The method or operation is not implemented.");
32             this._age = age;
33            
34             this._name = name;
35         }
36 
37         public override void ShowInformation()
38         {
39             //throw new Exception("The method or operation is not implemented.");
40             Console.WriteLine(_company +"  "+_companyAddress +"  "+_name +"  "+_id +"   "+_age );
41         }
42     }
43 }
44 

主要的是通过工厂来进行对象创建,当存在该对象时就取出该对象,否则抛出异常。同时,对工厂使用单件模式控制唯一性;

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace FlyWeightPatternSam
 6 {
 7     public class FlyweightFactory
 8     {
 9         private static readonly FlyweightFactory instance=new FlyweightFactory();
10         System.Collections.Generic.Dictionary<string, Employer> dictionary = new Dictionary<string, Employer>();
11 
12         private FlyweightFactory() 
13         {
14             dictionary.Add("01",new EmployerA());
15             dictionary.Add("02",new EmployerB());
16             dictionary.Add("03",new EmployerC());
17         }
18         
19         public static  FlyweightFactory Instance
20         {
21             get
22             {
23                 return instance;
24             }
25         }
26 
27         public Employer GetEmployer(string str) 
28         {
29             Employer employer = null ;
30             try
31             {
32                 employer = dictionary[str] as Employer;    
33             }
34             catch(Exception ex)
35             {
36                 Console.WriteLine(ex.Message);
37             }
38             return employer;
39         }
40     }
41 }
42 

客户端代码如下所示:

代码

using System;
using System.Collections.Generic;
using System.Text;

namespace FlyWeightPatternSam
{
    class Program
    {
        static void Main(string[] args)
        {

Employer employer = FlyweightFactory.Instance.GetEmployer("01");
            employer.SetPropertity("jasen","24");
            employer.ShowInformation();
            Console.ReadLine();
            
            employer = FlyweightFactory.Instance.GetEmployer("04");
            Console.ReadLine();
            
            employer = FlyweightFactory.Instance.GetEmployer("01");
            employer.SetPropertity("jasen", "25");
            employer.ShowInformation();
            Console.ReadLine();
        }
    }
}

操作结果如下:

**************************************************************************

源代码下载:/Files/jasenkin/FlyWeightPatternSam.rar

转载于:https://www.cnblogs.com/jasenkin/archive/2010/03/17/1688249.html

Flyweight Pattern简单随笔相关推荐

  1. C#设计模式之十一享元模式(Flyweight Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看."享元"是不是可以这样理解 ...

  2. 享元模式 Flyweight Pattern

    享元模式的定义为:采用一个共享来避免大量拥有相同内容对象的开销. 这种开销中最常见.直观的就是内存的损耗.享元模式以共享的方式高效地支持大量的细粒度对象. 在名字和定义中都体现了共享这个核心概念,那么 ...

  3. Net设计模式实例之享元模式( Flyweight Pattern)

    一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support larg ...

  4. 设计模式(14)-Flyweight Pattern

    一. 享元(Flyweight)模式 Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元模式" ...

  5. 第11章 享元模式(Flyweight Pattern)

    第11章 享元模式(Flyweight Pattern) 原文 第11章 享元模式(Flyweight Pattern) 概述:   面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题 ...

  6. 享元模式(Flyweight Pattern)

    一.定义 享元模式(Flyweight Pattern):结构型模式之一,运用共享技术有效地支持大量细粒度的对象. 二.UML类图 三.角色职责 抽象享元角色(IFlyweight):享元对象抽象基类 ...

  7. 享元模式(Flyweight Pattern)详解

    https://www.cnblogs.com/amei0/p/7930013.html 享元模式(Flyweight Pattern) 定义: 采用一个共享来避免大量拥有相同内容对象的开销.这种开销 ...

  8. 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  9. 建造者模式(Builder Pattern)简单随笔

    提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随着需求改变而改变. 一.建造者模式简介 建造者 ...

最新文章

  1. Docker源码分析(三):Docker Daemon启动
  2. 微信小程序支付最容易犯的坑notify_url(支付回调)
  3. Matlab错误:Y must be a vector or a character array
  4. BZOJ 3244: [Noi2013]树的计数
  5. deque,list,queue,priority_queue
  6. JDK安装与配置(Windows 7系统)
  7. 把数组排列成最小的数(详解)
  8. WP SyntaxHighlighter 初探
  9. tracker服务器php,FastDFS-5.05 tracker服务器安装nginx+php
  10. 04-02 接口协议分析工具
  11. Django学习系列之ModelForm
  12. VALSE学习(十四):自主学习
  13. html js 处理元素的数据属性(data)
  14. 系统分析与设计:笔记整理
  15. 如何快速区分单模与多模光纤收发器?
  16. 企业即时通讯行业评测——imo VS RTX
  17. execv bad address
  18. DropdownMenu 下拉菜单的使用
  19. 计算机vfp题库知识,全国计算机vfp二级考试题库(超全).docx
  20. 感抗、容抗、阻抗 计算

热门文章

  1. ubuntu下docker的安装及更换镜像源
  2. 操作系统(十)进程通信
  3. Exthereum - 最新开发的以太坊客户端
  4. 如何构建一个分布式爬虫:理论篇
  5. Android Hook (1) Dexposed原理
  6. python字典中append_零基础入手!Python中字典与集合的使用指南
  7. 软件获取手机的ime权限_【手机谷歌软件下载】【安卓+iOS】老湿机最爱~免翻,获取各种“特殊”资源!...
  8. android中占容器比例,Android中的容器
  9. mysql php页面流量统计_PHP学习笔记:php网络流量统计系统
  10. log4js linux,如何在项目中使用log4.js的方法步骤