? 作者简介,愚公搬代码 ?《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 ?《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
?《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
??欢迎 ?点赞?评论?收藏
设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。
毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。每种设计模式都有相应的原理和最佳实践,它们描述了我们日常开发中不断遇到的问题,以及这些问题的核心解决方法。正是因为这种实用性和通用性,设计模式才能在软件开发中广泛地得以应用。设计模式是构建稳健、可扩展和可维护软件的关键工具,为开发者们提供了解决问题的智慧和指导。
享元模式属于结构型设计模式,其主要目标是通过共享已存在的对象,高效地支持大量细粒度对象的创建和管理。该模式通过减少对象实例的创建,降低了系统的性能开销。
在享元模式中,系统会尝试重用已存在的相似对象。如果找到匹配的对象,它将直接返回该对象;如果未找到匹配的对象,则会创建新的对象。这种机制有助于减少内存占用和提高系统性能,特别是在需要大量相似对象的情况下。
简而言之,享元模式通过共享和重用对象,有效地优化了对象创建和管理的性能,提高了系统的效率。
享元模式(Flyweight Pattern)中的抽象享元(Flyweight)是该模式的核心概念之一,它具有重要的作用。以下是抽象享元的概念和作用:
抽象享元在享元模式中起着重要的角色,它定义了享元对象的通用接口和共享状态的管理方式,确保了对象的共享性和高效使用,同时也允许具体享元类添加特定于客户端的信息。这有助于降低内存消耗,提高系统的性能。
在享元模式(Flyweight Pattern)中,具体享元(Concrete Flyweight)是一种享元对象的具体实现,它实现了抽象享元接口(Abstract Flyweight),并包含了一部分内部状态。以下是具体享元的概念和作用:
具体享元的创建和管理通常由享元工厂(Flyweight Factory)来完成。享元工厂负责创建具体享元对象,并在需要时共享已存在的对象,以确保对象的重用。具体享元对象在多次请求中被共享,以降低资源消耗,特别适用于需要大量相似对象的情况。
具体享元是享元模式的具体实现,它允许多个对象共享相同的状态信息,以降低内存消耗和提高性能。通过将共享状态与非共享状态分离,具体享元对象能够在多个客户端之间共享,并在需要时动态创建。这使得享元模式在某些情况下能够有效地优化应用程序的资源利用率
享元模式(Flyweight Pattern)中的享元工厂(Flyweight Factory)是一个关键组件,负责创建和管理享元对象,以确保它们被有效地共享和重用。以下是享元工厂的概念和作用:
享元工厂在享元模式中扮演着关键的角色,它管理着享元对象的创建、共享和池化,以提高系统的效率和性能。通过享元工厂,可以有效地重用已存在的对象,降低内存开销,适用于需要大量相似对象的情况。
命名空间FlyweightPattern中包含IConnection接口充当抽象享元,Connection类充当具体享元,ConnectionFactory工厂类充当享元工厂。本案例通过使用享元模式来共享数据库连接。
public interface IConnection {
void Print();
}
IConnection接口,包含一个打印的方法。
public class Connection : IConnection {
private string _connectionString = null;
public Connection(string connectionString) {
_connectionString = connectionString;
Thread.Sleep(1000);
Console.WriteLine("It took 1 second(s) to create a connection!");
}
public void Print() {
Console.WriteLine($"Database connection is {_connectionString}");
Console.WriteLine("-------------------------------------------------------");
}
}
Connection类,定义数据库连接(演示)。
public class ConnectionFactory {
private Dictionary<string, IConnection> _connections = null;
private string _connectionString = null;
public ConnectionFactory() {
_connections = new Dictionary<string, IConnection>();
}
public IConnection CreateConnection(string connectionString) {
if (!_connections.ContainsKey(connectionString)) {
Console.WriteLine("Creating a new connection!");
IConnection connection = new Connection(connectionString);
_connections.Add(connectionString, connection);
return connection;
}
else {
Console.WriteLine("Return an exist connection!");
var connection = _connections[connectionString] as IConnection;
return connection;
}
}
}
ConnectionFactory类,数据库连接工厂,内部维持对所有连接的引用,CreateConnection方法在发现连接存在时直接返回,如果不存在,则创建一个新的连接并维持进列表。
注:实际开发过程中应该用HashCode来检索数据库连接是否存在。
public class Program {
private static ConnectionFactory _factory = null;
private static List<string> _connections = null;
private static IConnection _connection = null;
private static void Print(int index) {
if (index > _connections.Count - 1) {
Console.WriteLine("Index Out Of Range Exception!");
return;
}
_connection = _factory.CreateConnection(_connections[index]);
_connection.Print();
}
public static void Main(string[] args) {
_connections = new List<string> {
"Server=Aron1;Database=pubs;\n" + "Uid=uid;Pwd=password;",
"Provider=sqloledb;Data Source=Aron1;\n" + "User Id=uid;Password=password;",
"Data Source=192.168.0.1,1433;\n" + "UserID=uid;Password=password;"
};
_factory = new ConnectionFactory();
Print(0);
Print(1);
Print(2);
Print(1);
Print(3);
Console.ReadKey();
}
}
以上是调用方的代码,以下是这个案例的输出结果:
Creating a new connection!
It took 1 second(s) to create a connection!
Database connection is Server=Aron1;Database=pubs;
Uid=uid;Pwd=password;
-------------------------------------------------------
Creating a new connection!
It took 1 second(s) to create a connection!
Database connection is Provider=sqloledb;Data Source=Aron1;
User Id=uid;Password=password;
-------------------------------------------------------
Creating a new connection!
It took 1 second(s) to create a connection!
Database connection is Data Source=192.168.0.1,1433;
UserID=uid;Password=password;
-------------------------------------------------------
Return an exist connection!
Database connection is Provider=sqloledb;Data Source=Aron1;
User Id=uid;Password=password;
-------------------------------------------------------
Index Out Of Range Exception!
享元模式(Flyweight Pattern)具有多个优点,特别适用于需要大量对象的情况,其中许多对象具有相似的属性和行为。以下是享元模式的主要优点:
享元模式通过共享对象的方式来优化内存利用和提高性能,特别适用于需要管理大量相似对象的情况。这种模式在游戏开发、图形处理、文本编辑器等领域有广泛的应用。
享元模式(Flyweight Pattern)具有一些缺点,需要在使用时考虑。以下是享元模式的一些缺点:
享元模式在适当的情况下可以提供明显的性能和内存优势,但需要仔细权衡其优点和缺点,确保它适合特定的应用场景。在某些情况下,使用享元模式可能会增加复杂性,而在其他情况下,它可以有效地优化资源利用。
享元模式(Flyweight Pattern)适用于以下情况和场景:
享元模式在需要管理大量相似对象、共享状态信息、提高性能和降低内存消耗的情况下非常有用。它可以在多种领域中发挥作用,但需要谨慎设计和实现,以确保正确地管理共享状态和非共享状态。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。