福田网站制作公司,如何登录到wordpress,app开发商城,好网站建设公司有哪些享元模式#xff08;Flyweight Pattern#xff09;是一种结构型设计模式#xff0c;它的主要目的是通过共享已存在的对象来大幅度减少需要创建的对象数量#xff0c;从而降低系统内存消耗和提高性能。它通过将对象的状态划分为内部状态#xff08;Intrinsic State#xf…享元模式Flyweight Pattern是一种结构型设计模式它的主要目的是通过共享已存在的对象来大幅度减少需要创建的对象数量从而降低系统内存消耗和提高性能。它通过将对象的状态划分为内部状态Intrinsic State和外部状态Extrinsic State仅共享具有相同内部状态的对象。
原理
抽象享元类Flyweight Interface: 定义了所有具体享元类的公共接口通过这个接口客户端可以访问内在状态。具体享元类Concrete Flyweight: 实现抽象享元类存储并提供内部状态共享的具体实现。享元工厂Flyweight Factory: 负责创建和管理享元对象并确保正确地重用现有的享元对象。当请求一个新对象时如果该对象已经存在则返回已有的实例否则才创建一个新的实例。
Java代码示例
// 抽象享元类
public interface Shape {void draw(int x, int y);
}// 具体享元类圆形
public class Circle implements Shape {private String color; // 外部状态不共享// 内部状态被多个对象共享private static MapString, Circle circlePool new HashMap();private Circle(String color) {this.color color;}// 由享元工厂负责调用此方法以复用已有对象或创建新的对象public static Circle getCircle(String color) {if (!circlePool.containsKey(color)) {circlePool.put(color, new Circle(color));}return circlePool.get(color);}Overridepublic void draw(int x, int y) {System.out.println(Drawing a circle at ( x , y ) with color: color);}
}// 享元工厂
public class ShapeFactory {public static Shape getShape(String shapeType, String color) {if (circle.equals(shapeType)) {return Circle.getCircle(color);} else {// 其他类型的形状处理...throw new UnsupportedOperationException(Unsupported shape type);}}
}// 客户端
public class Client {public static void main(String[] args) {Shape circle1 ShapeFactory.getShape(circle, red);circle1.draw(10, 10);Shape circle2 ShapeFactory.getShape(circle, blue);circle2.draw(50, 50);// 如果颜色“red”已经创建过则circle3会复用之前的红色圆对象Shape circle3 ShapeFactory.getShape(circle, red);circle3.draw(100, 100);}
}想象你正在运营一家制作个性化T恤衫的公司每种颜色的T恤都是单独的一件衣服。为了节约成本你会把每种颜色的T恤看作是共享资源即每个颜色只准备一件基础T恤。当客户订购某种颜色的T恤时只要仓库中有对应颜色的基础T恤就直接使用这件基础T恤进行个性化的打印而不是每次都生产一件全新的T恤。这就是享元模式的思想在这里颜色就是内部状态而T恤上的文字或图案则是外部状态。 应用场景
在图形用户界面中绘制大量的相似对象如字体、图标等它们的大部分属性是相同的只有少数属性因位置或大小不同而变化。大规模游戏场景中的大量小物件比如森林里的树叶可以通过共享纹理资源来节省内存。
适用性
系统中存在大量相似对象并且这些对象的大部分状态都可以外部化时。对象的大多数状态都可以变为不可变的并且可以合理划分内部状态和外部状态。需要大幅度减少创建对象的数量以节省内存和提高性能。