Облегченный режим «Шаблон проектирования»

1. Что такое наилегчайшая модель?

Режим «Легкий вес» эффективно поддерживает детальное повторное использование объектов с небольшими изменениями состояния за счет технологии совместного использования.Когда в системе имеется несколько одинаковых объектов, используется только одна копия, и нет необходимости создавать экземпляр объекта для каждого из них, что значительно сокращает количество объектов в системе. Например, в текстовой системе каждая буква определяет объект, тогда всего имеется 52 прописные и строчные буквы, поэтому необходимо определить 52 объекта. Если текст размером 1М, то букв столько-то, если каждая буква определяет объект, то память исчерпается. Таким образом, если каждая буква будет использовать общий объект, ресурсы будут значительно сэкономлены.

Прежде чем понять режим наилегчайшего веса, мы должны сначала понять две концепции: внутреннее состояние и внешнее состояние.

  • Внутреннее состояние: общая часть внутри легковесного объекта, которая не меняется при изменениях во внешней среде.
  • Внешнее состояние: меняется по мере изменения окружающей среды, а состояние, которым нельзя поделиться, является внешним состоянием.

Поскольку шаблон-приспособленец различает внутреннее состояние и внешнее состояние, мы можем устанавливать разные внешние состояния, так что один и тот же объект может иметь разные характеристики, в то время как внутреннее состояние устанавливается для одной и той же части. В нашем процессе программирования нам может понадобиться большое количество мелкозернистых объектов для представления объектов. Если эти объекты одинаковы, за исключением нескольких разных параметров, то мы можем использовать шаблон легковеса, чтобы значительно сократить количество шагов в приложении. , Объект. Как использовать режим наилегчайшего веса? Здесь нам нужно всего лишь переместить небольшое количество их различных частей в качестве параметров за пределы экземпляра класса, а затем передать их при вызове метода. Это также иллюстрирует один момент: внутреннее состояние хранится внутри объекта-легковеса, тогда как внешнее состояние должно учитываться клиентом.

2. Структурная диаграмма UML

  • (1) Наилегчайший вес: абстрактный класс наилегчайшего веса, суперкласс или интерфейс всех конкретных классов наилегчайшего веса. Через этот интерфейс наилегчайший вес может принимать внешние темы и действовать по ним;
  • (2) ConcreteFlyweight: класс наилегчайшего веса бетона. Укажите внутреннее состояние и добавьте место для хранения внутреннего состояния.
  • (3) UnsharedConcreteFlyweight: неразделенный бетонный наилегчайший вес. Указывает те подклассы наилегчайшего веса, которые не нуждаются в совместном использовании.
  • (4) FlyweightFactory: класс фабрики Flyweight, используемый для создания объектов Flyweight и управления ими. В основном он используется для обеспечения разумного совместного использования Flyweight.

Ядром модели легковеса является класс фабрики легковеса. Класс фабрики легковеса поддерживает пул хранения объектов. Когда клиенту нужен объект, он сначала получает его из пула легковеса. Если в пуле легковеса есть экземпляр объекта, он будет возвращен напрямую. Если он не существует в пуле легковесов, создается новый экземпляр объекта легковеса и возвращается пользователю, а новый объект сохраняется в пуле легковесов. Это имеет значение одноэлементного объекта.

Фабричные классы обычно используют типы коллекций для сохранения объектов, такие как HashMap, Hashtable, Vector и т. д. В Java пулы подключений к базе данных, пулы потоков и т. д. — это все приложения, использующие режим приспособленца.

public class FlyweightFactory{
    private HashMap flyweights = new HashMap();
    
    public Flyweight getFlyweight(String key){
        if(flyweights.containsKey(key)){
            return (Flyweight)flyweights.get(key);
        }
        else{
            Flyweight fw = new ConcreteFlyweight();
            flyweights.put(key,fw);
            return fw;
        }
    }
}

3. Реализация кода

Сценарий: Если у нас есть приложение для рисования, с помощью которого мы можем рисовать графику различных форм и цветов, то форма и цвет здесь являются внутренними состояниями. Через режим-легковес мы можем реализовать совместное использование этого атрибута. следующее:

Во-первых, это класс формы: Shape.java. Это абстрактный класс, имеющий только один абстрактный метод для рисования графики.

public abstract class Shape {
    public abstract void draw();
}

Затем есть конкретный класс для рисования кругов. Круг.java:

public class Circle extends Shape{
    private String color;
    public Circle(String color){
        this.color = color;
    }
 
    public void draw() {
        System.out.println("画了一个" + color +"的圆形");
    }
}

Затем идет заводской класс наилегчайшего веса. Завод Flyweight:

//核心类
public class FlyweightFactory{
    static Map<String, Shape> shapes = new HashMap<String, Shape>();
    
    public static Shape getShape(String key){
        Shape shape = shapes.get(key);
        //如果shape==null,表示不存在,则新建,并且保持到共享池中
        if(shape == null){
            shape = new Circle(key);
            shapes.put(key, shape);
        }
        return shape;
    }
    
    public static int getSum(){
        return shapes.size();
    }
}

Здесь определяется HashMap для хранения каждого объекта. Когда пользователю нужен объект, он сначала получает его из пула легковесов. Если он не существует в пуле легковесов, создается новый объект легковеса, который возвращается пользователю и хранится в легковесном пуле. Сохраните новый объект в формате .

Наконец, клиентская программа: Client.java:

public class Client {
    public static void main(String[] args) {
        Shape shape1 = FlyweightFactory.getShape("红色");
        shape1.draw();
        
        Shape shape2 = FlyweightFactory.getShape("灰色");
        shape2.draw();
        
        Shape shape3 = FlyweightFactory.getShape("绿色");
        shape3.draw();
        
        Shape shape4 = FlyweightFactory.getShape("红色");
        shape4.draw();
        
        Shape shape5 = FlyweightFactory.getShape("灰色");
        shape5.draw();
        
        Shape shape6 = FlyweightFactory.getShape("灰色");
        shape6.draw();
        
        System.out.println("一共绘制了"+FlyweightFactory.getSum()+"中颜色的圆形");
    }
}

результат операции:

В Java тип String использует шаблон легковеса . Объект String является окончательным типом и не может быть изменен после создания объекта. Строковые константы Java хранятся в пуле строковых констант, и JVM гарантирует, что в пуле констант имеется только одна копия строковой константы. 

String a="abc", где "abc" — строковая константа. Те, кто знаком с Java, должны знать следующий пример:

String a = "hello";
String b = "hello";
if(a == b)
 System.out.println("OK");
else
 System.out.println("Error");

Вывод: ОК. Видно, что условие if сравнивает адреса двух a и b, которые также можно назвать пространством памяти.

4. Преимущества и недостатки модели наилегчайшего веса.

4.1. Преимущества режима наилегчайшего веса:

(1) Значительно сократить количество объектов в системе;

(2) Поскольку используется внешнее состояние, внешнее состояние является относительно независимым и не влияет на внутреннее состояние, поэтому режим легковеса позволяет совместно использовать объекты легковеса в разных средах.

4.2. Недостатки режима наилегчайшего веса:

(1) Поскольку в шаблоне-приспособленце необходимо различать внешнее и внутреннее состояние, приложение в определенной степени усложняется.

(2) Чтобы сделать объект доступным для совместного использования, состояние легковесного объекта необходимо экстернализовать, а чтение внешнего состояния увеличивает время работы.

4.3. Применимые сценарии:

(1) Если в системе имеется большое количество одинаковых или похожих объектов, большое использование таких объектов приведет к потреблению системной памяти.Вы можете использовать режим легковеса, чтобы уменьшить количество объектов в системе.

(2) Большая часть состояния объекта может быть экстернализована, и эти внешние состояния могут быть переданы в объект.

Справочная статья:  Структурный тип шаблона проектирования Java: шаблон-легковес_Блог Чжана Вэйпэна-блог CSDN

рекомендация

отblog.csdn.net/m0_50370837/article/details/126305428