Шаблон пула объектов

Java

Эта статья взята из статьи «Вот как следует изучать шаблоны проектирования».

1 Определение режима пула объектов

Шаблон пула объектов — это своего рода шаблон проектирования создания. Объекты предварительно создаются, инициализируются и помещаются в пул объектов. Поставщики объектов могут использовать существующие объекты для обработки запросов, что снижает потребность в частом создании объектов. Занимаемый объем памяти и время инициализации. Пул объектов содержит набор объектов, которые были инициализированы и могут использоваться, а объекты можно создавать и уничтожать по мере необходимости. Пользователи пула объектов могут получать объекты из пула, манипулировать ими и возвращать их в пул, когда они не нужны, вместо их непосредственного уничтожения. Пул объектов — это специальный фабричный объект, а режим пула объектов — это одноэлементный режим плюс режим легковеса.

2 Сценарии применения режима пула объектов

Режим пула объектов в основном подходит для следующих сценариев приложений.

(1) Сценарии с ограниченными ресурсами. Например, в среде, не требующей масштабируемости (ограниченные физические ресурсы, такие как ЦП/память), производительность ЦП недостаточно высока, объем памяти относительно мал, сборка мусора и джиттер памяти окажут относительно большое влияние и необходимо повысить эффективность управления памятью, скорость отклика, чем пропускная способность. Количество важнее.

(2) Ограниченное количество объектов в памяти.

(3) Для создания объектов с высокой стоимостью можно рассмотреть возможность объединения.

Дополнение: Общие сценарии использования пулов объектов включают в себя различные пулы соединений, пулы потоков, пулы соединений с базой данных и т. д. при использовании Socket.

3 Диаграмма классов UML шаблона пула объектов

Диаграмма классов UML шаблона пула объектов показана на следующем рисунке.

file

Как видно из рисунка выше, режим пула объектов в основном включает в себя 3 роли.

(1) Пул объектов (ObjectPool): содержит объекты и предоставляет методы выборки/возврата.

(2) Абстрактный объединенный объект (PooledObject): абстракция объектов в пуле.

(3) ConcretePoolObject: инкапсулирует объекты в пуле, инкапсулирует состояние объекта и некоторую другую информацию.

4 Общее написание режима пула объектов

Ниже приведен общий способ написания шаблона пула объектов.


public class Client {

    public static void main(String[] args) {
        ObjectPool pool = new ObjectPool(10,50);
        IPooledObject object = pool.borrowObject();
        object.operation();
        pool.returnObject(object);
        System.out.println();
    }

    //抽象对象
    interface IPooledObject {
        void operation();
    }
    //具体对象
    static class ConcretePoolObject implements IPooledObject {
        public void operation() {
            System.out.println("doing");
        }
    }

    //对象池
    static class ObjectPool {
        private int step = 10;  					//当对象不够用的时候,每次扩容的数量
        private int minCount;
        private int maxCount;
        private Vector<IPooledObject> returneds; 	//保存未借出的对象
        private Vector<IPooledObject> borroweds; 	//保存已被借出的对象

        //初始化对象池
        public ObjectPool(int minCount,int maxCount){
            borroweds = new Vector<IPooledObject>();
            returneds = new Vector<IPooledObject>();

            this.minCount = minCount;
            this.maxCount = maxCount;

            refresh(this.minCount);
        }

        //因为内部状态具备不变性,所以作为缓存的键
        public IPooledObject borrowObject() {
            IPooledObject next = null;
            if(returneds.size() > 0){
                Iterator<IPooledObject> i = returneds.iterator();
                while (i.hasNext()){
                    next = i.next();
                    returneds.remove(next);
                    borroweds.add(next);
                    return next;
                }
            }else{
                //计算出剩余可创建的对象数
                int count = (maxCount - minCount);
                //剩余可创建的数量大于单次固定创建的对象数
                //则再初始化一批固定数量的对象
                refresh(count > step ? step : count);
            }
            return next;
        }

        //不需要使用的对象归还重复利用
        public void returnObject(IPooledObject pooledObject){
            returneds.add(pooledObject);
            if(borroweds.contains(pooledObject)){
                borroweds.remove(pooledObject);
            }
        }

        private void refresh(int count){
            for (int i = 0; i < count; i++) {
                returneds.add(new ConcretePoolObject());
            }
        }
    }
}

Самая большая разница между режимом пула объектов и режимом легковеса заключается в том, что в режиме пула объектов есть еще один метод повторного использования объектов. Следовательно, шаблон пула объектов должен быть более конкретным сценарием применения шаблона Приспособленца. Это эквивалентно сначала заимствованию объекта из пула объектов, а затем возврату его обратно после того, как он будет израсходован, чтобы обеспечить повторное использование ограниченных ресурсов.

5 преимуществ шаблона пула объектов

Повторно используйте объекты в пуле, чтобы исключить нагрузку на память, ЦП и сеть, вызванную созданием и повторным использованием объектов.

6 недостатков шаблона пула объектов

(1) Увеличиваются накладные расходы на размещение/сдачу объектов.

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

(3) Из-за ограниченного количества объектов в пуле он обязательно станет узким местом масштабируемости.

(4) Трудно разумно установить размер пула объектов: если он слишком мал, он не будет работать, если слишком велик, он будет занимать большие ресурсы памяти.

[Рекомендация] Архитектура бомбы Тома: 30 реальных случаев шаблонов проектирования (с исходным кодом), бросающих вызов годовой зарплате в 60 Вт — это не мечта

Эта статья является оригиналом "Архитектуры бомбы Тома", пожалуйста, указывайте источник при перепечатке. Технология заключается в обмене, я разделяю свое счастье! Если эта статья полезна для вас, пожалуйста, подпишитесь и поставьте лайк, если у вас есть какие-либо предложения, вы также можете оставить комментарий или личное сообщение Ваша поддержка является движущей силой для меня, чтобы продолжать творить. Обратите внимание на «архитектуру бомбы Тома», чтобы получить больше технической галантереи!