《大话设计模式》学习笔记22:享元模式

  

   

网站共享代码示例:

1.Flyweight:

    public abstract class WebSite
    {
        public abstract void Use();
    }

2.ConcreteeFlyweight:

    public class ConcreteWebSite:WebSite
    {
        private string webSiteCategory;
        public ConcreteWebSite(string webSiteCategory)
        {
            this.webSiteCategory = webSiteCategory;
        }
        public override void Use()
        {
            Console.WriteLine("网站分类:" + webSiteCategory);
        }
    }

3.FlyweightFactory:

    public class WebSiteFactory
    {
        private Hashtable webSites = new Hashtable();

        public WebSite GetWebSiteCategory(string key)
        {
            if(!webSites.ContainsKey(key))
            {
                webSites.Add(key, new ConcreteWebSite(key));
            }
            return (WebSite)webSites[key];
        }

        public int GetWebSiteCount()
        {
            return webSites.Count;
        }
    }

4.客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            WebSiteFactory webSiteFactory = new WebSiteFactory();

            WebSite webSiteA = webSiteFactory.GetWebSiteCategory("产品展示");
            webSiteA.Use();

            WebSite webSiteB = webSiteFactory.GetWebSiteCategory("产品展示");
            webSiteB.Use();

            WebSite webSiteC = webSiteFactory.GetWebSiteCategory("博客");
            webSiteC.Use();

            WebSite webSiteD = webSiteFactory.GetWebSiteCategory("博客");
            webSiteD.Use();

            Console.WriteLine("网站分类总数为:{0}", webSiteFactory.GetWebSiteCount());
        }
    }

内部状态与外部状态:

  在享元对象内部并且不会随环境改变而改变的共享部分,可以称为享元对象的内部状态;而随环境改变而改变的、不可以共享的状态为外部状态。

  享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。

网站共享代码示例:

  

1.外部状态:

    public class User
    {
        public string Name { get; private set; }

        public User(string name)
        {
            Name = name;
        }
    }

2.Flyweight:

    public abstract class WebSite
    {
        public abstract void Use(User user);
    }

3.ConcreteeFlyweight:

    public class ConcreteWebSite : WebSite
    {
        private string webSiteCategory;

        public ConcreteWebSite(string webSiteCategory)
        {
            this.webSiteCategory = webSiteCategory;
        }
        public override void Use(User user)
        {
            Console.WriteLine("网站分类:" + webSiteCategory + "\t用户:" + user.Name);
        }
    }

4.FlyweightFactory:

    public class WebSiteFactory
    {
        private Hashtable webSites = new Hashtable();

        public WebSite GetWebSiteCategory(string key)
        {
            if(!webSites.ContainsKey(key))
            {
                webSites.Add(key, new ConcreteWebSite(key));
            }
            return (WebSite)webSites[key];
        }
        public int GetWebSiteCount()
        {
            return webSites.Count;
        }
    }

5.客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            WebSiteFactory webSiteFactory = new WebSiteFactory();

            WebSite webSiteA = webSiteFactory.GetWebSiteCategory("产品展示");
            webSiteA.Use(new User("用户A"));

            WebSite webSiteB = webSiteFactory.GetWebSiteCategory("产品展示");
            webSiteB.Use(new User("用户B"));

            WebSite webSiteC = webSiteFactory.GetWebSiteCategory("博客");
            webSiteC.Use(new User("用户C"));

            WebSite webSiteD = webSiteFactory.GetWebSiteCategory("博客");
            webSiteD.Use(new User("用户D"));

            Console.WriteLine("网站分类总数为:{0}", webSiteFactory.GetWebSiteCount());
        }
    }
时间: 2024-08-29 19:39:15

《大话设计模式》学习笔记22:享元模式的相关文章

设计模式学习08:享元模式

设计模式学习08:享元模式 参考资料 https://www.jianshu.com/p/a2aa75939766 https://www.cnblogs.com/adamjwh/p/9070107.html 简介 Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象. 享元模式(Flyweight)又称为 轻量级模式,它是一种对象结构型模式. 面向对象技术可

javascript设计模式学习之十一——享元模式

一.享元模式的定义及使用场景 享元模式是一种用于性能优化的模式,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 享元模式的关键是区分内部状态和外部状态,剥离了外部状态的对象成为共享对象,外部状态在必要时被传入共享对象来组装成一个完整的对象.那些可以被对象共享的属性通常就被划分为内部状态.

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

说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如:例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案: 享元模式(Flyweight):对象结构型模式运用

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

学习日记之享元模式和Effective C++

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

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set

PHP设计模式学习笔记: 责任链模式(Chain of Responsibility)

// 抽象书本类 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); } // 书本类,继承自抽象书本类 class BookTopic extends AbstractBookTopic { private $topic; private $title; function __co

《JavaScript设计模式与开发实践》读书笔记之享元模式

1. 享元模式 享元模式是一种用于性能优化的模式,享元模式的核心是运用共享技术来有效支持大量细粒度的对象 1.1 传统的文件上传方法 以文件上传为例,文件上传功能可以选择依照队列,一个一个的排队上传,也支持同时选择2000个文件.假如每一个文件都对应着一个JavaScript上传对象的创建,2000个文件就会同时创建2000个upload对象假设这里的文件上传支持插件和flash两种 var id=0; window.startUpload=function(uploadType,files){

大话设计模式学习笔记

大话设计模式笔记 1. 使用简单工厂模式(使用反射可以解决避免分支判断问题) 注重创建不同的对象 2. 使用策略模式处理 不同的时间应用不同的业务规则 3. 单一原则:一个类仅有一个变化的原因  发现职责并把职责分离 4. 开放-封闭原则:软件实体可以扩展但不能修改  对扩展开放 对更改封闭 开发人员对程序中呈频繁变化的那部分做出抽象 5. 依赖倒转原则: A.高层模块不应依赖底层模块.两者都应该依赖抽象. B.抽象不应该依赖细节,细节应该依赖于抽象.即针对接口编程, 不应针对实现编程. 里氏替

设计模式(十一)享元模式

场景:内存属于稀缺资源,不要随便浪费.如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存. 核心:享元模式以共享的方式高效地支持大量细粒度对象的重用. 享元对象能做到共享的关键是区分了内部状态和外部状态. 内部状态:可以共享,不会随环境变化而改变. 外部状态:不可以共享,会随环境变化而改变. 例如: 围棋软件设计 每个围棋棋子都是一个对象,有如下属性:颜色.形状.大小(这些是可以共享的,称之为内部状态) 位置(这是不可以共享的,称之为外部状态) 享元模式实现: FlyWeightF