zoukankan      html  css  js  c++  java
  • 设计模式之笔记--享元模式(Flyweight)

    享元模式(Flyweight)

    定义

          享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。

    类图

    描述

    Flyweight:抽象享元类,是所有的具体享元类的基类,为子类规定出需要实现的公共接口。那些需要外部状态的操作可以通过调用Flyweight的方法并以参数的形式传入。

    ConcreteFlyweight:具体享元类,实现抽象享元角色所规定的接口。如果有内部状态的话,可以在类内部定义。

    FlyweightFactory:享元工厂,用来创建和管理享元对象,主要用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。

    内部状态:是指在享元对象内部并且不会随环境改变而改变的共享部分,内部状态存储于ConcreteFlyweight对象中;

    外部状态:是指随环境改变而改变、不可以共享的部分,外部状态存储于外部对象中,当调用Flyweight对象的操作时,将外部状态传递给Flyweight对象。

    享元模式可以看作是一种最简单的缓存技术的实现。

    应用场景

        public class Student
        {
            private string name;
    
            public string Name
            {
                get { return name; }
            }
    
            public Student(string name)
            {
                this.name = name;
            }
        }
    
        public abstract class AbstractCourse
        {
            public abstract void Print(Student student);
        }
    
        public class Course : AbstractCourse
        {
            /// <summary>
            /// 课程名称
            /// </summary>
            private string name;
    
            /// <summary>
            /// 课时
            /// </summary>
            private int periods;
    
            public Course(string name, int periods)
            {
                this.name = name;
                this.periods = periods;
            }
    
            public override void Print(Student student)
            {
                Console.WriteLine(student.Name + ":	" + this.name + "(" + this.periods + "课时)");
            }
        }
    
        public class CourseFactory
        {
            private Dictionary<string,Course> courses = new Dictionary<string,Course>();
    
            /// <summary>
            /// 获取课程
            /// </summary>
            /// <param name="name"></param>
            /// <param name="periods"></param>
            /// <returns></returns>
            public Course GetCourse(string name, int periods)
            {
                if (!this.courses.ContainsKey(name)) //如果不存在相应的课程就新建一个课程实例
                {
                    courses.Add(name, new Course(name, periods));
                }
                return this.courses[name];
            }
    
            /// <summary>
            /// 获取开课总数
            /// </summary>
            /// <returns></returns>
            public int GetCourseCount()
            {
                Console.WriteLine("开课总数:" + this.courses.Count);
                return this.courses.Count;
            }
        }

    享元模式和单例模式的区别:

    享元是对象级别的, 即多个相同的对象在共享区里只保存一个对象;

    单例是级别的, 即该类只能实例化出来一个对象。

  • 相关阅读:
    Lerning Entity Framework 6 ------ Defining Relationships
    Lerning Entity Framework 6 ------ Defining the Database Structure
    Lerning Entity Framework 6 ------ Introduction to TPH
    Lerning Entity Framework 6 ------ Introduction to TPT
    Lerning Entity Framework 6 ------ Using a commandInterceptor
    Lerning Entity Framework 6 ------ A demo of using Entity framework with MySql
    C#是否该支持“try/catch/else”语法
    Hadoop学习之旅三:MapReduce
    CLR via C# 摘要二:IL速记
    Java 制表符 " "
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/5408164.html
Copyright © 2011-2022 走看看