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;
            }
        }

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

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

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

  • 相关阅读:
    objective-c保护属性
    第十七章、程序管理与 SELinux 初探 工作管理 (job control)
    第十七章、程序管理与 SELinux 初探
    Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等
    go语言初始化内部结构体3中方式
    数据结构之C语言模拟整数数组实现
    使用python将元组转换成列表,并替换其中元素
    ruby中的类实例变量和实例的实例变量
    读<<programming ruby>> 7.6节 flip-flop 理解
    ruby逻辑判断符号
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/5408164.html
Copyright © 2011-2022 走看看