前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#设计模式——(结构型-享元设计模式)

C#设计模式——(结构型-享元设计模式)

原创
作者头像
用户10053120
发布2022-10-15 16:31:49
3400
发布2022-10-15 16:31:49
举报
文章被收录于专栏:C# 设计原则C# 设计原则

一、应用场景

需求:要建立PC版电商网站、小程序版的电商网站、App版的电商网站。

措施:将代码复制粘贴,根据用户的不同需求,定制化的进行修改、开发。

存在问题:

  • 针对每个用户的网站,都需要创建新的服务器资源,数据库资源,造成资源浪费;
  • 代码迭代的成本巨大。

解决方案:

  • 整合到一个网站中,共享其相关的代码和数据,对于硬件资源可以大大减小使用量;
  • 对于代码,由于核心的代码和数据都是共享同一份实例,提高啦代码的维护性和扩展性。

总结:当系统中大量使用某些相同或者相似的对象,这些对象会消耗大量的资源,并且这些对象剔除外部状态后都可以通过同一个对象来替代,这时,我们可以使用享元设计模式来解决。

享元和单例模式的区别:以共享单车为例,如果是单例模式,一座城市就只有一辆小黄车。享元模式是一座城市投放几万量小黄车供几千万人使用,避免资源的浪费。

  • 内部状态:对象内部不受环境改变的部分作为内部状态;如上传视频的内容。
  • 外部状态,随着环境的变化而变化的部分。如上传视频的用户、视频的名称

享元模式运用共享技术有效的支持大量细粒度的对象;

享元模式有池的概念,单例没有。

享元模式有内部状态、外部状态之分,单例没有。

享元模式的uml图如下:

  1. Flyweight是抽象享元角色。它是产品的抽象类,同时定义出对象的外部状态和内部状态(外部状态及内部状态相关内容见后方)的接口或实现;
  2. ConcreteFlyweight是具体享元角色,是具体的产品类,实现抽象角色定义的业务;
  3. UnsharedConcreteFlyweight是不可共享的享元角色,一般不会出现在享元工厂中;
  4. FlyweightFactory是享元工厂,它用于构造一个池容器,同时提供从池中获得对象的方法。

二、代码

代码语言:javascript
复制
        public abstract class FlyWeightBike
        {
            //内部状态:BikeID、State(1表示骑行中,0表示使用中)、
            //外部状态:骑车子的用户
            //方法:骑行、锁车
            public string BikeID { get; set; }
            public int State { get; set; }
            public abstract void Ride(string userName);
            public abstract void Back(string userName);
        }
        public class YellowBike : FlyWeightBike
        {
            public YellowBike(string id)
            {
                this.BikeID = id;
            }
            public override void Back(string userName)
            {
                this.State = 0;
                Console.WriteLine("用户" + userName + "正在归还,ID是" + this.BikeID + "的自行车");
            }
            public override void Ride(string userName)
            {
                this.State=1;
                Console.WriteLine("用户"+userName+"正在骑行,ID是"+this.BikeID+"的自行车");
            }
        }
        public class BikeFactory
        {
            List<FlyWeightBike> bikePool = new List<FlyWeightBike>();
            public BikeFactory()
            {
                for (int i = 0; i < 3; i++)
                {
                    bikePool.Add(new YellowBike(i.ToString()));
                }
            }
            public FlyWeightBike GetBike()
            {
                for (int i = 0; i < bikePool.Count; i++)
                {
                    if (bikePool[i].State==0)
                    {
                        return bikePool[i];
                    }                     
                }
                return null;
            }
        }
代码语言:javascript
复制
            BikeFactory bikeFactory = new BikeFactory();
            FlyWeightBike flyWeightBike= bikeFactory.GetBike();
            flyWeightBike.Ride("张三");
            flyWeightBike.Back("张三");
            FlyWeightBike flyWeightBike1 = bikeFactory.GetBike();
            flyWeightBike1.Ride("李四");
            FlyWeightBike flyWeightBike2 = bikeFactory.GetBike();
            flyWeightBike2.Ride("王五");

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档