首页 > 其他分享 >享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)

时间:2023-05-23 22:34:53浏览次数:34  
标签:享元 Draw Color Pattern circle radius Flyweight Circle 100

享元模式(Flyweight Pattern)

一、定义

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

运用共享技术有效地支持大量细粒度的对象。

二、优缺点

优点: 大大减少对象的创建,降低系统的内存,使效率提高。

缺点: 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

三、具体实现

3.1 原型图
  1. Flyweight抽象类:描述一个接口,通过这个接口可以接受并作用于外部状态。
  2. ConcreteFlyweight类:实现Flyweight接口,并为内部状态增加存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的。
  3. UnsharedConcreteFlyweight类:并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点(Row和Column)
  4. FlyweightFactory类:创建并管理flywieght对象,确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或创建一个(如果不存在的话)
  5. Client客户端:维持一个对flyweight的引用,计算或存储一个(多个)flyweight的外部状态。
3.2 实现

1、创建一个Flyweight接口。

/**
 * @author zhongtao
 * @date 2023/5/23 22:10
 */
public interface Shape {
    void draw();
}

2、创建实现接口的实体类ConcreteFlyweight。

/**
 * @author zhongtao
 * @date 2023/5/23 22:10
 */
public class Circle implements Shape {
    private String color;
    private int x;
    private int y;
    private int radius;

    public Circle(String color) {
        this.color = color;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("Circle: Draw() [Color : " + color
                + ", x : " + x + ", y :" + y + ", radius :" + radius);
    }
}

3、创建一个工厂FlyweightFactory,生成基于给定信息的实体类的对象。

import java.util.HashMap;

/**
 * @author zhongtao
 * @date 2023/5/23 22:10
 */
public class ShapeFactory {
    private static final HashMap<String, Shape> circleMap = new HashMap<>();

    public static Shape getCircle(String color) {
        Circle circle = (Circle) circleMap.get(color);

        if (circle == null) {
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Creating circle of color : " + color);
        }
        return circle;
    }
}

4、使用该工厂,通过传递颜色信息来获取实体类的对象。

/**
 * @author zhongtao
 * @date 2023/5/23 22:11
 */
public class FlyweightPatternDemo {
    private static final String colors[] =
            {"Red", "Green", "Blue", "White", "Black"};

    public static void main(String[] args) {

        for (int i = 0; i < 20; ++i) {
            Circle circle =
                    (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.setX(getRandomX());
            circle.setY(getRandomY());
            circle.setRadius(100);
            circle.draw();
        }
    }

    private static String getRandomColor() {
        return colors[(int) (Math.random() * colors.length)];
    }

    private static int getRandomX() {
        return (int) (Math.random() * 100);
    }

    private static int getRandomY() {
        return (int) (Math.random() * 100);
    }
}

5、执行程序,输出结果:

Creating circle of color : Green
Circle: Draw() [Color : Green, x : 22, y :58, radius :100
Circle: Draw() [Color : Green, x : 12, y :57, radius :100
Circle: Draw() [Color : Green, x : 17, y :42, radius :100
Circle: Draw() [Color : Green, x : 2, y :40, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 88, y :40, radius :100
Circle: Draw() [Color : Blue, x : 81, y :17, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 84, y :50, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 78, y :61, radius :100
Circle: Draw() [Color : Green, x : 4, y :49, radius :100
Creating circle of color : Black
Circle: Draw() [Color : Black, x : 83, y :81, radius :100
Circle: Draw() [Color : Blue, x : 42, y :29, radius :100
Circle: Draw() [Color : Black, x : 39, y :87, radius :100
Circle: Draw() [Color : Green, x : 57, y :94, radius :100
Circle: Draw() [Color : Red, x : 2, y :55, radius :100
Circle: Draw() [Color : Red, x : 17, y :30, radius :100
Circle: Draw() [Color : White, x : 80, y :57, radius :100
Circle: Draw() [Color : Red, x : 48, y :35, radius :100
Circle: Draw() [Color : Blue, x : 5, y :42, radius :100
Circle: Draw() [Color : White, x : 71, y :75, radius :100
Circle: Draw() [Color : Green, x : 3, y :23, radius :100

标签:享元,Draw,Color,Pattern,circle,radius,Flyweight,Circle,100
From: https://www.cnblogs.com/zt19994/p/17426587.html

相关文章

  • 外观模式(Facade Pattern)
    外观模式(FacadePattern)一、定义 外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对......
  • 策略模式(Strategy Pattern)
    一、模式动机策略模式(StrategyPattern)用于算法的自由切换和扩展,是一种使用较为广泛的行为型模式。策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便地更换算法或者增加新的算法。它将每一个算法封装在一个称为具体策略的类中,......
  • 状态模式(Sate Pattern)
    一、模式动机状态模式(StatePattern)是一种较为复杂的行为型模式。它用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对......
  • 观察者模式(Observer Pattern)
    一、模式动机观察者模式用于描述对象之间的依赖关系,它引入了观察者和观察目标两类不同的角色,由于提供了抽象层,它使得增加新的观察者和观察目标都很方便。观察者模式广泛应用于各种编程语言的事件处理模型中,Java语言也提供了对观察者模式的全面支持。一个对象的状态或行为的变......
  • 迭代器模式(Interator Pattern)
    一、模式动机迭代器模式(IteratorPattern)是一种使用频率非常高的行为型设计模式,迭代器用于对一个聚合对象进行遍历。通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成,简化了聚合对象的设计,更符合“单一职责原则”的要求。......
  • 命令模式(Command Pattern)
    一、模式动机命令模式(CommandPattern)是一种常用的行为型设计模式,它将请求发送者与请求接收者解耦,请求发送者通过命令对象来间接引用接收者,使得系统具有更好的灵活性,可以在不修改现有系统源代码的情况下将相同的发送者对应不同的接收者,也可以将多个命令对象组合成宏命令,还可以在......
  • 行为型模式(Behavioer Pattern)
    行为型设计模式行为型模式定义了系统中对象之间的交互与通信,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责,包括对系统中较为复杂的流程的控制。在软件系统运行时对象并不是孤立存在的,它们可以通过相互通信和协作完成某些功能,一个对象在运行时也将影响其他对象......
  • 代理模式(Proxy Pattern)
    一、模式动机通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作,或者将新的对象作为真实对象的一个替身引入代理对象来间接访问一个对象二、模式定义给某一个对象提供一个代理,并由代理对象控制对原对象的引用对象结构型模式代理对象可以在客户端和目标对......
  • 外观模式(Facade Pattern)
    一、模式动机外观模式(FacadePattern)是一种使用频率非常高的设计模式,它通过引入一个外观角色来简化客户端和子系统之间的操作,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。外观模式中,外部与一个子系统的通信可以通过一个统一的外观......
  • 原型模式(Prototype Pattern)
    原型模式(PrototypePattern)一、意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。二、优缺点优点:1、性能提高。2、逃避构造函数的约束。缺点:1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个......