12.享元模式(Flyweight Pattern)

using System;
using System.Collections;

namespace ConsoleApplication5
{
    class Program
    {
        /// <summary>
        /// 在软件开发过程,如果我们需要重复使用某个对象的时候,
        /// 如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,
        /// 这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,
        /// 下面具体看看享元模式是如何去解决这个问题的。
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            CharactorFactory factory = new CharactorFactory();

            // Charactor "A"
            CharactorA ca = (CharactorA)factory.GetCharactor("A");
            ca.SetPointSize(12);
            ca.Display();

            // Charactor "B"
            CharactorB cb = (CharactorB)factory.GetCharactor("B");
            cb.SetPointSize(10);
            cb.Display();

            // Charactor "C"
            CharactorC cc = (CharactorC)factory.GetCharactor("C");
            cc.SetPointSize(14);
            cc.Display();

        }
    }

    // 字符工厂(负责创建和管理享元对象)
    public class CharactorFactory
    {
        // Fields
        private Hashtable charactors = new Hashtable();

        // Constructor
        public CharactorFactory()
        {
            charactors.Add("A", new CharactorA());
            charactors.Add("B", new CharactorB());
            charactors.Add("C", new CharactorC());
        }

        // Method
        public Charactor GetCharactor(string key)
        {
            Charactor charactor = charactors[key] as Charactor;

            if (charactor == null)
            {
                switch (key)
                {
                    case "A": charactor = new CharactorA(); break;
                    case "B": charactor = new CharactorB(); break;
                    case "C": charactor = new CharactorC(); break;
                    //
                }
                charactors.Add(key, charactor);
            }
            return charactor;
        }
    }

    /// <summary>
    /// 字符特殊类,提供具体享元类具有的方法
    /// </summary>
    public abstract class Charactor
    {
        //Fields
        protected char _symbol;
        protected int _width;
        protected int _height;
        protected int _ascent;
        protected int _descent;
        protected int _pointSize;

        //Method
        public abstract void SetPointSize(int size);
        public abstract void Display();
    }

    /// <summary>
    /// 字符A
    /// </summary>
    public class CharactorA : Charactor
    {
        // Constructor
        public CharactorA()
        {
            this._symbol = ‘A‘;
            this._height = 100;
            this._width = 120;
            this._ascent = 70;
            this._descent = 0;
            this._pointSize = 12;
        }

        //Method
        public override void SetPointSize(int size)
        {
            this._pointSize = size;
        }

        public override void Display()
        {
            Console.WriteLine(this._symbol +
              "pointsize:" + this._pointSize);
        }
    }

    /// <summary>
    /// 字符B
    /// </summary>
    public class CharactorB : Charactor
    {
        // Constructor
        public CharactorB()
        {
            this._symbol = ‘B‘;
            this._height = 100;
            this._width = 140;
            this._ascent = 72;
            this._descent = 0;
            this._pointSize = 10;
        }

        //Method
        public override void SetPointSize(int size)
        {
            this._pointSize = size;
        }

        public override void Display()
        {
            Console.WriteLine(this._symbol +
              "pointsize:" + this._pointSize);
        }
    }

    /// <summary>
    /// 字符C
    /// </summary>
    public class CharactorC : Charactor
    {
        // Constructor
        public CharactorC()
        {
            this._symbol = ‘C‘;
            this._height = 100;
            this._width = 160;
            this._ascent = 74;
            this._descent = 0;
            this._pointSize = 14;
        }

        //Method
        public override void SetPointSize(int size)
        {
            this._pointSize = size;
        }

        public override void Display()
        {
            Console.WriteLine(this._symbol +
              "pointsize:" + this._pointSize);
        }
    }

}
时间: 2024-08-04 17:57:14

12.享元模式(Flyweight Pattern)的相关文章

二十四种设计模式:享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支持这些对象. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Flyweight { /// <summary> /// Message实体类 ///

设计模式(结构型)之享元模式(Flyweight Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之外观模式(Facade Pattern)>http://blog.csdn.net/yanbober/article/details/45476527 概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.所以需要采用一

设计模式——12.享元模式

1. 模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题. 享元模式正是为解决这一类问题而诞生的.享元模式通过共享技术实现相同或相似对象的重用. 在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可

享元模式Flyweight

享元模式 享元模式Flyweight,布布扣,bubuko.com

享元模式-Flyweight(Java实现)

享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, 就到家里的书架上拿, 如果有就直接看, 没有就去买一本, 回家看. 看完了就放到家里的书架上, 以后再想看了直接就在书架上拿, 不需要再去买同样的这本书了. 不适用享元模式: 小明想看编程技术的书, 就去书店里买一本回家看, 买完后看完了, 书就不知道丢到了哪里去了. 下次想看的时候就找不到了,

C#设计模式(12)——享元模式(Flyweight Pattern)

一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的. 二.享元模式的详细介绍 在前面说了,享元模式可以解决上面的问题了,在介绍享元模式之前,让我们先要分析下如果去解决上面那个问题,上面的问题就是重复创建了同一个对象,如果让我们去解决这个问题肯定会这样想:"既然都是同一个

享元模式-Flyweight

享元模式:运用共享技术有效地支持大量细粒度的对象. 内部状态和外部状态: 享元模式可以避免大量的非常相似的类的开销.在程序设计中,有时需要生成大量细粒度的类实例来表示数据.如果能发现这些实例除了几个参数外基本上都相同,有时就能大幅度减少需要实例化的类的数量.如果能把那些参数移到类实例的外部,在方法调用时将它们传递进来,就可以通过共享,大幅度地减少单个实例的数目. 何时使用享元模式: 如果一个应用程序使用了大量的对象,而大量的这些对象造成了存储开销时就应该考虑使用;还有就是对象的部分状态可已放到外

【设计模式】—— 享元模式Flyweight

前言:[模式总览]——————————by xingoo 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了. 再比如餐馆的桌子,餐具,这些都是享元模式的体现.客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具. 应用场景 1 一个系统应用到了大量的对象,而且很多都是

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,