
11.享元模式(Flyweight Pattern)
FlyweightFactory类:负责创建和管理飞-weight对象。通过 GetFlyweight方法:根据提供的状态创建或返回对应的飞-weight实例。 ListFlyweights方法:列出当前已注册的飞-weight对象。 Flyweight类:表示一个飞-weight对象,持有共享的状态,并提供操作方法来执行特定于单一状态的操作。 Car类:表示一个汽车对象,包含了汽车的所有属性,如公司、型号、颜色等。
发布日期:2021-05-10 05:01:39
浏览次数:26
分类:精选文章
本文共 4923 字,大约阅读时间需要 16 分钟。
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在在消耗较少内存的情况下支持大量对象的创建。这种模式通过共享已存在的对象实例来减少内存占用,从而提高系统资源的利用率。在现实生活中,我们可以看到许多重复的对象,如棋子、电脑等。在程序设计中,传统的方法会为每个对象分配独立的内存空间,导致内存占用大量增加,造成资源浪费。享元模式通过共享这些对象的状态,避免重复创建,从而解决了这一问题。
享元模式的意图
享元模式的核心意图是通过共享技术,有效地支持大量细粒度的对象。通过这种方式,可以在保持功能一致性的同时,显著减少内存占用。
享元模式的主要优点
相同对象只需保存一份,降低了系统中对象数量,从而减轻了内存压力。这种共享机制使得系统能够支持更多的细粒度对象,提升了资源利用率。
享元模式的主要缺点
为使对象可以共享,需要将某些状态外部化,这会增加程序的复杂性。此外,由于状态的外部化,读取外部状态的开销也会稍微增加运行时间。
享元模式的实现示例
以下是一个使用C#语言实现享元模式的示例代码:
using Newtonsoft.Json;using System;using System.Collections.Generic;using System.Linq;namespace _11_FlyWeight{ class Program { static void Main(string[] args) { var factory = new FlyweightFactory( new Car { Company = "Chevrolet", Model = "Camaro2018", Color = "pink" }, new Car { Company = "Mercedes Benz", Model = "C300", Color = "black" }, new Car { Company = "Mercedes Benz", Model = "C500", Color = "red" }, new Car { Company = "BMW", Model = "M5", Color = "red" }, new Car { Company = "BMW", Model = "X6", Color = "white" } ); factory.ListFlyweights(); AddCarToPoliceDatabase(factory, new Car { Number = "CL234IR", Owner = "James Doe", Company = "BMW", Model = "BMW", Color = "red" }); AddCarToPoliceDatabase(factory, new Car { Number = "CL234IR", Owner = "James Doe", Company = "BMW", Model = "X1", Color = "red" }); factory.ListFlyweights(); Console.ReadKey(); } public static void AddCarToPoliceDatabase(FlyweightFactory factory, Car car) { Console.WriteLine("\nClient: Adding a car to database."); var flyweight = factory.GetFlyweight(new Car { Color = car.Color, Model = car.Model, Company = car.Company }); flyweight.Operation(car); } } public class Flyweight { private Car _sharedState; public Flyweight(Car car) { _sharedState = car; } public void Operation(Car uniqueState) { string s = JsonConvert.SerializeObject(_sharedState); string u = JsonConvert.SerializeObject(uniqueState); Console.WriteLine($"Flyweight: Displaying shared {s} and unique {u} state."); } } public class FlyweightFactory { private List> flyweights = new List >(); public FlyweightFactory(params Car[] args) { foreach (var item in args) { flyweights.Add(Tuple.Create(new Flyweight(item), GetKey(item))); } } public string GetKey(Car key) { var elements = new List (); elements.Add(key.Model); elements.Add(key.Color); elements.Add(key.Company); if (key.Owner != null && key.Number != null) { elements.Add(key.Number); elements.Add(key.Owner); } elements.Sort(); return string.Join("_", elements); } public Flyweight GetFlyweight(Car sharedState) { string key = GetKey(sharedState); Flyweight flyweight = flyweights.Where(t => t.Item2 == key).FirstOrDefault().Item1; if (flyweight == null) { flyweight = new Flyweight(sharedState); flyweights.Add(Tuple.Create(flyweight, key)); Console.WriteLine("FlyweightFactory: Creating new flyweight."); } else { Console.WriteLine("FlyweightFactory: Reusing existing flyweight."); } return flyweight; } public void ListFlyweights() { int count = flyweights.Count; Console.WriteLine("\nFlyweightFactory: I have {0} flyweights:", count); foreach (var flyweight in flyweights) { Console.WriteLine(flyweight.Item2); } } } public class Car { public string Owner { get; set; } public string Number { get; set; } public string Company { get; set; } public string Model { get; set; } public string Color { get; set; } }}
代码解释
GetKey
方法生成唯一的标识符来区分不同的飞-weight对象。通过这种方式,系统可以在保持功能一致性的同时,显著减少内存占用,提高资源利用率。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月21日 12时23分55秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Boostrap技能点整理之【网格系统】
2019-03-11
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11
Git简单理解与使用
2019-03-11
echarts 基本图表开发小结
2019-03-11
adb通过USB或wifi连接手机
2019-03-11
JDK9-15新特性
2019-03-11
TreeSet、TreeMap
2019-03-11
JVM内存模型
2019-03-11
可变长度参数
2019-03-11
3、条件查询
2019-03-11
cordova打包apk更改图标
2019-03-11
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2019-03-11
文件系统的层次结构
2019-03-11
vue(渐进式前端框架)
2019-03-11
vscode设置eslint保存文件时自动修复eslint错误
2019-03-11
Remove Extra one 维护前缀最大最小值
2019-03-11
Linux操作系统的安装与使用
2019-03-12
C++ 继承 详解
2019-03-12
OSPF多区域
2019-03-12
Docker入门之-镜像(二)
2019-03-12