南阳千牛网站建设,网站开发与运维收费明细,做网站卖什么产品利润高,内含各种专业的网站搭建模板享元模式简介
享元模式定义 享元模式#xff08;Flyweight Pattern#xff09;是一种用于优化性能的软件设计模式。它是一种结构型的设计模式。它的主要目的是通过共享物件来减少内存使用量#xff0c;同时分享信息给尽可能多的相似物件#xff0c;从而降低内存消耗和提高…享元模式简介
享元模式定义 享元模式Flyweight Pattern是一种用于优化性能的软件设计模式。它是一种结构型的设计模式。它的主要目的是通过共享物件来减少内存使用量同时分享信息给尽可能多的相似物件从而降低内存消耗和提高系统性能。这种模式特别适用于那些因为重复而导致使用大量内存的大量物件。享元模式将对象的状态分为内部状态和外部状态其中一些具有相同内部状态的对象可以被多个对象共享而不是为每个对象都创建新的实例而外部状态是变化的不能共享。通过共享不变的部分可以减少不必要的对象创建和内存消耗提高系统性能。
享元模式包含以下角色
抽象享元角色Flyweight Interface享元对象抽象了一个接口或抽象类用于声明享元对象的方法。这些方法使得外部状态能够以参数形式传入。通常这个接口不会涉及到外部状态的具体细节它仅仅关注于内部状态的操作。具体享元角色Concrete Flyweight具体享元角色实现了抽象享元接口并包含内部状态的存储。内部状态是享元对象可以共享的部分具体享元角色可以被多个客户端对象共享。享元工厂角色Flyweight Factory负责创建和管理享元对象。它维护了一个享元对象的缓存池当客户端请求享元对象时工厂会首先检查缓存池中是否存在具有相同内部状态的享元对象如果存在则直接返回否则创建一个新的享元对象并添加到缓存池中。客户端角色Client持有对享元对象的引用并负责在必要时通过享元工厂获取享元对象。客户端角色与享元对象交互并可能提供外部状态给享元对象。
享元模式优缺点 优点
减少内存消耗通过共享大量相似对象可以减少系统中对象的数量从而降低内存消耗。这在处理大量相似对象时尤为有效可以显著提高系统的资源利用率。性能提升由于共享的对象可以被多个客户端共享所以减少了对象的创建和销毁次数享元模式可以提高系统的性能。特别是在频繁创建和销毁对象的场景中享元模式能够显著减少这些操作带来的开销。降低系统复杂性享元模式将内部状态与外部状态是分离的状态使得系统更容易理解和维护。内部状态由享元对象管理外部状态由客户端管理降低了系统的复杂性可以有效地降低对象间的耦合度。
缺点
增加编程复杂性实现享元模式需要将对象的状态分为内部状态和外部状态需要对内部状态和外部状态进行较为繁琐的区分这要求开发者对系统的状态管理有深入的理解。增加系统的维护性由于享元模式将对象的状态分为内部状态和外部状态这可能会增加系统的复杂度使得系统的维护变得困难。特别是在处理复杂的业务逻辑时需要格外小心以确保状态的正确性和一致性。降低代码的可读性由于享元模式涉及到对对象状态的划分和共享可能会使得代码的逻辑变得复杂降低代码的可读性。这要求开发者在编写代码时注重注释和文档以提高代码的可理解性。可能引入线程安全问题如果多个线程同时访问和修改共享对象可能会导致线程安全问题。因此在使用享元模式时需要特别注意线程安全的处理。
使用场景
当程序中需要创建大量相似对象并且这些对象可以共享一部分状态时使用享元模式可以节省内存和提高性能。当创建对象的成本较高且对象的状态可以分为内部状态和外部状态时可以考虑使用享元模式。内部状态可以由对象共享而外部状态则通过参数传递给享元对象。这样可以减少创建对象的数量提高系统的可扩展性和性能。在需要处理大量数据的系统中可能存在大量的重复对象。这些对象可以通过享元模式来共享减少对象的创建和内存消耗提高系统的性能和可扩展性。在高并发的系统中可能存在大量的请求和对象。通过享元模式共享对象可以减少对象的创建和销毁提高系统的并发处理能力和响应速度。
以下举一个享元模式的例子 下面通过一个简单的例子来演示。将一辆小汽车可以看做是一个享元对象共享的部分是小汽车的基本属性比如颜色发动机排量等。相同颜色、发动机排量的小汽车可以共享同一个对象不需要每次创建新的对象。
创建抽象享元角色Flyweight Interface
public abstract class Car {protected String color;protected String engine;public Car(String color, String engine) {this.color color;this.engine engine;}public abstract void show();
}
创建具体享元角色Concrete Flyweight
public class BMW extends Car {public BMW(String color, String engine) {super(color, engine);}Overridepublic void show() {System.out.println(生产BMW汽车颜色是 color 发动机排量是 engine);}
}public class Benz extends Car{public Benz(String color, String engine) {super(color, engine);}Overridepublic void show() {System.out.println(生产Benz汽车颜色是 color 发动机排量是 engine);}
}创建享元工厂角色Flyweight Factory
import java.util.HashMap;
import java.util.Map;public class CarFactory {public static MapString, Car carMapnew HashMap();public static Car getCar(String color,String type){String keycolor_type;if(carMap.containsKey(key)){//如果已经有该颜色和类型的汽车直接返回return carMap.get(key);}else {Car car null;//没有创建并放入缓存if(BMW.equals(type)){car new BMW(color,2.0L);}else if (Benz.equals(type)){car new Benz(color,2.0L);}else {System.out.println(没有该类型的汽车);}//放入缓存carMap.put(key,car);return car;}}
}创建客户端Client
public class Client {public static void main(String[] args) {Car bmwCar CarFactory.getCar(白色, BMW);Car benzCar CarFactory.getCar(白色, Benz);bmwCar.show();benzCar.show();System.out.println(现在已存在有 CarFactory.carMap.size() 种类型的汽车及共享的相同对象);System.out.println();System.out.println(创建上面创建过的相同颜色和类型的汽车);Car bmwCar2 CarFactory.getCar(白色, BMW);bmwCar2.show();System.out.println(创建相同颜色和类型的汽车后现在已存在有 CarFactory.carMap.size() 种类型的汽车及共享的相同对象);System.out.println();System.out.println(创建上面没有添加过的颜色的汽车);Car bmwCar3 CarFactory.getCar(黑色, BMW);bmwCar3.show();System.out.println(创建不同的颜色相同类型的汽车后现在已存在有 CarFactory.carMap.size() 种类型的汽车及共享的相同对象);}
}输出结果如下所示
生产BMW汽车颜色是白色发动机排量是2.0L
生产Benz汽车颜色是白色发动机排量是2.0L
现在已存在有2种类型的汽车及共享的相同对象创建上面创建过的相同颜色和类型的汽车
生产BMW汽车颜色是白色发动机排量是2.0L
创建相同颜色和类型的汽车后现在已存在有2种类型的汽车及共享的相同对象创建上面没有添加过的颜色的汽车
生产BMW汽车颜色是黑色发动机排量是2.0L
创建不同的颜色相同类型的汽车后现在已存在有3种类型的汽车及共享的相同对象在上述例子中我们共享了Car类并在创建Car类时设置了不同颜色。虽然我们创建了多次小汽车但它们相同颜色和相同发动机排量的共享同一个享元对象因此创建相同相同颜色和相同发动机排量的汽车时可以减少了内存占用。
总而言之 享元模式是一种用于优化性能的软件设计模式它通过共享对象来减少内存中对象的数量从而降低内存消耗并提高系统性能。该模式主要适用于大量相似对象、对象创建成本较高、需要精细化控制对象共享、大数据量处理、高并发以及分布式系统中的对象共享等场景。享元模式的优点包括减少内存消耗、提高性能以及支持大量细粒度对象。然而它也可能增加编程的复杂性并可能引入线程安全问题。因此在选择使用享元模式时需要仔细评估其适用性和潜在影响。享元模式是一种非常有用的设计模式可以帮助我们优化系统性能并减少内存消耗。但是它也需要在具体场景下仔细考虑和权衡利弊确保正确使用并带来实际的效益。
以上代码下载请点击该链接https://github.com/Yarrow052/Java-package.git